2011-01-05 2 views
2

Я пишу приложение RCP Eclipse, которое будет содержать другие плагины помимо моего собственного, и вам нужно будет определить, когда приложение простаивает (т. Е. Нет активности в течение определенного периода времени, приложение минимизировано и т. Д.), И когда это изменится (т.е. приложение возвращается на передний план, щелчок мыши и т. д.).Приложение Eclipse RCP - как определить, когда приложение простаивает?

Проблема, с которой я сталкиваюсь, заключается в том, что я собираюсь захватить все нажатия клавиш и щелчки мыши, используя это, чтобы сбросить таймер, и когда таймер попал, может произойти некоторая обработка бездействия (т.е. информирование сервера о безделье - и снова при переключении на активный - ничего интенсивного). Однако оболочка окна приложения не принимает дочерние события для разных представлений и т. Д., Так что либо я что-то пропускаю, либо это неправильный подход.

Может ли кто-нибудь предложить решение? Я не ищу общесистемную безделье - простое бездействие.

Спасибо.

ответ

1

Может быть,

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

является то, что вы ищете (Вы можете добавить другие события, тоже)?

Это выполняется до обработки событий выполняется компонент мудр ...

Но его использование не рекомендуется - она ​​должна быть очень ограниченное использование случай, так.

+0

Я думаю, что так я и буду. Я не согласен. Я надеялся избежать этого звонка, так как это может быть опасно. Я также использую код сбора мусора в качестве примера для обеспечения его жесткости (см. Третий ответ ниже). – 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

I как это. Вы уже использовали этот шаблон? Вопрос в том, есть ли какие-то «технические» события, которые обрабатываются без реального взаимодействия с пользователем? – mtraut

+0

Я не использовал его для определения незанятости, но я использовал его в тех случаях, когда мне нужно вручную обрабатывать события в основном потоке, не освобождая его. – JesperE

2

Затмение IDE уже есть нечто подобное для выполнения Garbage Collection, посмотрите на класс org.eclipse.ui.internal.ide.application.IDEIdleHelper в Bundle org.eclipse.ui.ide.application

+0

Спасибо - этот класс подтверждает, что сказал mtraut выше. – ssnyder

Смежные вопросы