Я пытаюсь закрыть приложение SWT после определенного периода бездействия. Мне трудно рассчитать период бездействия. Все, что я пробовал, просто закрывает приложение через указанное время, независимо от того, работаю ли я над приложением.
Ниже приведен код того, что я пробовал
Timer timer = new Timer();
display.asyncExec(new Runnable(){
public void run() {
while(!shell.isDisposed()){
if (!display.readAndDispatch()){ //if the system is idle
timer.schedule(new TimerTask() { //schedule timer which will trigger after 1min.
@Override
public void run() {
logout();
}
}, 60000);
}
else{ // reschedule the timer
timer.cancel();
Timer timer = new Timer();
}
}
}
});
с этим я просто могу выйти из системы через 1 минуту, даже если пользователь что-то выполняет. Есть ли способ проверить время бездействия в SWT?
Вы можете использовать Display.addFilter
для прослушивания различных событий, которые делают приложение «активным». Используйте Display.timerExec
для многократного запуска кода в потоке пользовательского интерфейса, чтобы проверить время, прошедшее с момента последнего события.
Может быть, что-то вроде:
private Instant lastActive;
....
lastActive = Instant.now();
final Listener listener = new Listener()
{
@Override
public void handleEvent(final Event event)
{
lastActive = Instant.now();
}
};
display.addFilter(SWT.MouseMove, listener);
display.addFilter(SWT.KeyDown, listener);
// TODO more filters if required
final Runnable timer = new Runnable()
{
@Override
public void run()
{
final Instant now = Instant.now();
if (ChronoUnit.SECONDS.between(lastActive, now) > xxx) { // Number of inactive seconds here
System.out.println("inactive"); // Inactive code here
}
else {
display.timerExec(1000, this);
}
}
};
display.timerExec(1000, timer);
... create/open shell ...
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
Сэр, вы великолепны.
Возможно, используйте
Display.addFilter
для прослушивания различных событий, которые вы считаете «активностью», и сохраняйте последнее активное время.