Закрытие приложения SWT после определенного времени бездействия - PullRequest
1 голос
/ 22 мая 2019

Я пытаюсь закрыть приложение 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 Ответ

2 голосов
/ 22 мая 2019

Вы можете использовать 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();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...