一定时间不活动后关闭SWT应用程序

时间:2019-05-22 10:35:39

标签: java swt

我试图在一段时间的不活动时间后关闭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中的不活动时间?

1 个答案:

答案 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();
    }
相关问题