2011-01-05 72 views
2

我正在編寫一個Eclipse RCP應用程序,除了我自己的應用程序外,還會有其他插件貢獻,並且需要確定應用程序何時閒置(即一段時間內沒有活動,應用程序最小化等),以及何時發生更改(即應用程序返回到前臺,點擊鼠標等)。Eclipse RCP應用程序 - 如何檢測應用程序何時閒置?

我遇到的問題是,我要捕獲所有應用程序的擊鍵和鼠標移動/點擊...使用它來重置計時器,並且當計時器被擊中時,則可能發生一些空閒處理(即通知服務器閒置 - 然後再次當我們切換到活動 - 沒有密集)。但是,應用程序窗口外殼不會接收各種視圖等的子事件,因此無論是我錯過了什麼,或者這是錯誤的方法。

任何人都可以提供解決方案嗎?我不是在尋找系統閒置 - 只是應用程序閒置。

謝謝。

回答

1

也許這

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

就是你正在尋找(你可以添加其他的事件,太)是什麼?

之前事件處理完成組件明智這是執行...

一般不建議使用它 - 它應該是一個非常有限的情況下使用,所以。

+0

我認爲這是我將要走的路。不理想,我同意。我曾希望避免這個呼叫,因爲它可能是危險的。我還使用垃圾收集代碼作爲保持緊密的一個示例(請參閱下面的第三個響應)。 – ssnyder 2011-01-05 20:37:51

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 2011-01-05 21:01:23

+0

我沒有用它來檢測閒置狀態,但是我已經在需要手動處理主線程中的事件而不釋放它的控制的情況下使用它。 – JesperE 2011-01-06 14:26:59

2

Eclipse IDE中已經有類似的執行垃圾收集,看看在類org.eclipse.ui.internal.ide.application.IDEIdleHelper捆綁org.eclipse.ui.ide.application

+0

謝謝 - 這個班級證實了上面mtraut的說法。 – ssnyder 2011-01-05 20:38:39