2011-01-05 26 views
2

私はEclipse RCPアプリケーションを作成しています。これは自分自身以外のプラグインの貢献もしており、アプリケーションがアイドル状態のとき(つまり一定期間活動がない、アプリケーションが最小限になるなど) (すなわち、アプリケーションはフォアグラウンドに戻され、マウスがクリックされるなど)。Eclipse RCPアプリケーション - アプリケーションがアイドル状態のときの検出方法

問題は、すべてのアプリケーションのキーストロークとマウスの動き/クリックをキャプチャすることです...タイマーをリセットするためにそれを使用し、タイマーがヒットしたら、何らかのアイドル処理が発生する可能性があります。サーバに怠惰を通知します。その後、再びアクティブに切り替えると、何も集中しません)。しかし、アプリケーションウィンドウのシェルは、さまざまなビューなどの子イベントを受け取っていないので、何かが見つからないか、またはこれが間違った方法です。

誰でもソリューションを提供できますか?私はシステム全体の怠惰を探しているわけではなく、単にアプリケーションの怠惰を探しています。

ありがとうございました。

答えて

1

たぶん

display.addFilter(SWT.MouseDown, new Listener() { 
     @Override 
     public void handleEvent(Event event) { 
     } 
    }); 

は、あなたが探しているものであること(あなたも、他のイベントを追加することができますか)?イベント処理が賢明部品行われる前にこれが実行される

...

しかしその使用は一般的に推奨されません - それはそう、非常に制限されたユースケースでなければなりません。

+0

これは私が行く方法だと思います。理想的ではない、私は同意する。私は危険なのでこの呼び出しを避けることを望んでいた。また、ガベージコレクションのコードをきちんとしたものとして使用しています(下記の第3の回答を参照してください)。 – ssnyder

1

処理するメッセージがなくなったときにreadAndDispatchメソッドがfalseを返すという事実を利用できます。このような何か:

long lastActivityAt = 0; 
int idleThresholdSecs = 5; 
while (true) 
{ 
    while (display.readAndDispatch()) 
    { 
     lastActivityAt = System.nanoTime(); 
    } 

    if (System.nanoTime() - lastActivityAt > idleThresholdSecs * 1000 * 1000 * 1000) 
    { 
     // we have been idle for at least "idleThresholdSecs" 
     ... 
    } 
    else 
    { 
     Thread.sleep(50); 
    } 
} 
+0

私はこのような。あなたはすでにこのパターンを使いましたか?実際のユーザーとのやりとりなしに処理される「技術的な」イベントがあるかどうかです。 – mtraut

+0

私はアイドル状態を検出するためにこれを使用していませんが、メインスレッドでイベントを手動で処理する必要がある場合に使用しています。 – JesperE

2

のEclipse IDEがすでにガベージコレクションを実行するのに似た何かを持っている、バンドルorg.eclipse.ui.ide.applicationにクラスorg.eclipse.ui.internal.ide.application.IDEIdleHelperを見てみ

+0

ありがとうございます - このクラスは上記のmtrautが言ったことを確認します。 – ssnyder

関連する問題