我试图在一段时间的不活动时间后关闭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中的不活动时间?
答案 0 :(得分:2)
您可以使用Display.addFilter
来监听使应用程序“处于活动状态”的各种事件。使用Display.timerExec
在UI线程中重复运行代码,以检查自上一次事件以来的时间。
也许像这样:
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();
}