Закрытие приложения 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?

Возможно, используйте Display.addFilter для прослушивания различных событий, которые вы считаете «активностью», и сохраняйте последнее активное время.

greg-449 22.05.2019 12:47
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
1
1
149
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать 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();
    }

Сэр, вы великолепны.

Sambit 22.05.2019 15:06

Другие вопросы по теме