2013-08-09 9 views
6

答えはプラットフォームに依存しないことが理想的ですが、プラットフォーム固有のもの、特にOracle JVMも同様に便利です。私が取り組んでいるプロジェクトはまだバージョン6のJVMを実行しています。AWT/Swingイベントキューの長さをプログラムでレポートするにはどうすればよいですか?

特に必要なのは、時々「フリーズ」するGUIです。私はEDTのGUI作業についてよく知っています。このプログラムはWindows上でうまくいきましたが、Linuxに移行した後、これらの「奇妙な」GUIの問題が発生し始めました。実際には、この問題は、WindowsからLinuxへの移行後も、2つのアプリケーションで発生しています。 JVisualVMには、1000万以上のオブジェクトが表示されます。java.awt.EventQueueItem疑問は、AWTキューがLinux上で提供されているよりも速く成長しているということです。そのため、AWTキューの長さインジケータをアプリケーションに配置し、キューが拡大/縮小するときに表示される内容を確認することです。

Google検索のビットがthisでしたが、キューのリニアスキャンが行われました。多分もっと良い方法がありますか?

+1

探索するには、[ここ](http://stackoverflow.com/q/3158254/230513)に示すように、イベントを傍受することができます。 – trashgod

+0

Ten _million_! 'setCoalesce(false)'? – trashgod

+0

既にそれを考えてスキャンしました。合体ロジックをオフにしません。 –

答えて

3

興味深い主題。私はEventQueueのコードにビットを調査してきた、と私はあなたの問題を解決していないが、私はいくつかの有用なポインタを持っていることがあります。

  1. あなたが引き継ぐない限り、サイズの変数を保持していないのEventQueueのOracleの実装EventQueue(3を参照)を完全に制御すると、OracleのJREを使用する場合、キューのリニアスキャンよりも優れた方法はありません。
  2. 独自のEventQueueを作成することもできます(おそらく、Oracleの実装にコピーを加え、いくつかの調整**が最も簡単になります)。EventQueue.push(EventQueue)を使用して独自の実装をインストールします。キュー内のすべてのイベントはキューに転送されるため、キューに登録されたイベントを数えることができます。残念ながら、これはまだリニアスキャンですが、少なくともプラットフォームに依存しません。
  3. また、元のイベントキューが作成された後、できるだけ早く独自のEventQueue実装(2を参照)をインストールすることができます(メインメソッドを含むクラスの先頭にある静的コードブロックで行います)。それで、あなたの実装は、投稿されたすべてのイベントをカウントすることができ、サイズを知りたいときにキューをスキャンする必要はありません。 (誰も私はこれを試していないが、私はすべての公開/保護された静的コードを除去します:

**いくつかの調整)は、あなただけの他の誰もあなたの上に自分自身のEventQueueをプッシュしていない願っていますする必要がありますそれらのメソッド/変数を参照すると、java.awt.EventQueueが使用されます)、サイズ変数を追加し、この変数をpostEvent(AWTEvent, int),getNextEventPrivate(),getNextEvent(int)およびremoveSourceEvent(Object, boolean)の4つのメソッドで更新します。

この変更で大きな問題がEventQueueのは、あなたの実装が異なるパッケージになりますので、あなたが呼び出すことが許可されていないデフォルトの可視性とAWTの方法にはいくつかの呼び出し(例えば、Toolkit.getEventQueue()Component.getAccessControlContext())を、作るという事実であります。それぞれのケースごとに個別に回避策を見つける必要があります。

+0

"コピー貼り付け"は何ですか?、彼は 'EventQueu'を拡張してから、自分の実装を'プッシュ 'することができます。 – nachokk

+0

問題は、プライベートメソッドを修正する必要があるということです。 java.awt.EventQueueのすべてのコードは独自のプライベートメソッドを呼び出すので、これらのメソッドも再実装する必要があります。この再実装の連鎖は、パブリックメソッドまたは保護されたメソッドに到達すると停止します。さらに、チェーンにデフォルトの可視性を持つメソッドが含まれていて、javaのどこかから呼び出されている場合すべての呼び出しをプライベートメソッドに自分の実装にリダイレクトすることは不可能になります。すべての実用的な目的のために、私はそれがコピー貼り付けより良いと思う。 –

関連する問題