Приложение Eclipse RCP - как определить, когда приложение бездействует? - PullRequest
2 голосов
/ 05 января 2011

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

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

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

Спасибо.

Ответы [ 3 ]

2 голосов
/ 05 января 2011

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

1 голос
/ 05 января 2011

Может быть,

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

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

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

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

1 голос
/ 05 января 2011

Вы можете использовать тот факт, что метод 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);
    }
}
...