掲示板お問い合わせランダムジャンプ



この広告は30日以上更新がないブログに表示されております。 新しい記事を書くことで広告を消すことができます。

2008年05月04日
フォントの作りすぎにご用心
この障害は10年ほど前にWin32APIを使っていた時に体験したのだが、まさかSWTで同じ体験をするとは思っていなかった(苦笑)
さて、具体的に何が起きたかをまとめてみよう。

【現象】
 SWTアプリケーション(私が作成したのはEclipse RCPだが)を操作中、突然表示が崩れる。アプリケーションそのものは正常動作しているようだが、画面の再描写が行われないので表示が出来ない。
完全に同じデータで同じ操作を行えば再現性あり。

ということで、最初はSWTがらみの深いところで起こった障害かと少々不安になったが、Windows95や98、WindowsNTの頃に同じ障害を体験したのを思い出し、もしやと思い修正してみたら見事に的中した。

【原因】
フォントのインスタンスを作りすぎたため。その都度ユーザー側でインスタンスを削除しても、ある回数だけフォントのインスタンスを作成するとこの障害が起きる。これはWin32API側の不具合。

……まぁ、かなりの回数(厳密に検証してはいないが、私の環境で数千回程度)が必要ではあるのだが、仕様によっては意外と簡単にこの回数は消費してしまう。というのは、以前私が書いたこのような使い方をしていて、セルごとやボタンごとに違うフォントを使用するなどでその都度フォントを作っていると(org.eclipse.swt.graphics.Fontのインスタンスをnewしていると)、かなり簡単に使い切ってしまうのだ。
※明示的にインスタンスを消しても(親をdisposeしたりnullを代入したりしても)この不具合が起こることには注意が必要。

根本的な解決方法は無い。しかし上記のような使い方では、フォントのインスタンスを使いまわす事は比較的容易なはずだ。フォントごとにstaticにインスタンスを作成しそれを利用すればいい。そのような形でフォントのインスタンスを作成する回数自体を減らしていけば、この不具合は比較的容易に回避できるだろう。

……いやはや、不具合もここまで懐かしいと逆に感慨が沸くかもしれない(失笑)

[ 投稿者:朽木三郎 at 00:29 | Java SWT | コメント(2) | トラックバック(0) ]

この記事へのコメント
FontRegistryを使うといいかも
JFaceにFontRegistryというアプリケーションで利用するFontを貯めておくクラスがあり、Fontのインスタンスを使いまわす時には便利です。JFaceResources.getFontRegistry()でインスタンスが取得出きるので、そこにお好みのキー名でputしていってくださいませ。
ちなみにColorクラスもボコボコ作っていくとリソースを食っていくので、JFaceResourcesで管理したほうがいいですよ。
投稿者: こんぴろ at 2008-07-08 07:08:59
ありがとうございます!
ColorはColorでColorRegistryというモノがあるみたいですね。早速、FontとColorまわりのリファクタリングに着手することにしましょう。有益な情報、大変にありがとうございました。
投稿者: 朽木三郎 at 2008-07-08 18:53:20

この記事へのトラックバック

この記事へのトラックバックURL
http://shinshu.fm/MHz/52.04/a08159/0000237426.trackback

この記事の固定URL
http://shinshu.fm/MHz/52.04/archives/0000237426.html

記事へのコメント
 
簡単演算認証: 2 x 4 + 5 =
計算の答えを半角英数字で入力して下さい。
名前: [必須]
URL/Email:
タイトル:
コメント:
※記事・コメントなどの削除要請はこちら