Закрытие окна по бездействию

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Закрытие окна по бездействию

Сообщение Андрей »

Прошу подсказать как реализовать автозакрытие окна по бездействию пользователя (в данном случае только клава) ?
Например Timer=60 c., если ничего не нажимается - окно закрывается, если нажата любая клавиша - таймер надо сбросить в 0.
Аватара пользователя
morkovin
Ветеран
Сообщения: 908
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

Закрытие окна по бездействию

Сообщение morkovin »

Есть готовый шаблон
#!Template for timing out windows.
#Extension(ADITimeoutWindow,'close window after seconds of inactivity'),Procedure
...
См. аттач.
Вложения
ADIIdle.tpl
(3.33 КБ) 305 скачиваний
WBR, morkovin
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Закрытие окна по бездействию

Сообщение kreator »

Я делал без шаблона.

Код: Выделить всё

ThisWindow.TakeEvent PROCEDURE

ReturnValue          BYTE,AUTO

! Start of "WindowManager Method Data Section"
! [Priority 3500]

Looped BYTE
! [Priority 8500]

! End of "WindowManager Method Data Section"
  CODE
  ! Start of "WindowManager Method Executable Code Section"
  ! [Priority 1300]
  [color=#FF0000]if event()<>EVENT:Timer
    LOC:Time = clock()
  end[/color]
    
  
  ! Top of CYCLE/BREAK support
  LOOP                                                     ! This method receives all events
    IF Looped
      RETURN Level:Notify
    ELSE
      Looped = 1
    END
  ! [Priority 3000]
  
  EnhancedFocusManager.TakeEvent()
  ! [Priority 4100]
  
  ! Parent Call
  ReturnValue = PARENT.TakeEvent()
  ! [Priority 6300]
  
  ! Bottom of CYCLE/BREAK support
    RETURN ReturnValue
  END
  ReturnValue = Level:Fatal
  ! [Priority 8800]
  
  ! End of "WindowManager Method Executable Code Section"
  RETURN ReturnValue

Код: Выделить всё

    OF EVENT:Timer
      ! Start of "Window Event Handling"
      ! [Priority 4499]
      [color=#FF0000]if clock()-LOC:Time>3000
        LOC:ReturnValue = 1
        post(EVENT:CloseWindow)
      end[/color]
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Закрытие окна по бездействию

Сообщение Yufil »

... В 12 часов по ночам
Играет сигнал "CloseWindow" :D

А что будет, если мы кнопками или клавишами тыкаем в другом треде? И Event:Timer портить не хочется, вдруг он мне нужен...

Я у себя пользовал IDLE, она как-то надёжнее и действует сразу на все треды. Первично в глобальной переменной устанавливается дата и время завершения, а потом при работе программы значение этой переменной передвигается. Но мне надо было останавливать не одно окно, а всю программу.
kreator
✯ Ветеран ✯
Сообщения: 4960
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 6 раз
Поблагодарили: 19 раз

Закрытие окна по бездействию

Сообщение kreator »

Я сделал под свои специфические требования. 12 часов ночи - прокол. Надо переделать. Хотя вряд ли кто попадает. Даже если и работает, 30 секунд всего даю на бездействие. А вот как IDLE прикрутить к данной задаче мне не понятно.
We are hard at work… for you. :)
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Закрытие окна по бездействию

Сообщение Yufil »

Примерно так

Переменная Glo:Stop_Time - время остановки программы. Если какие-то телодвижения происходят, это время сдвигается.
Если время достигнуто - завершаемся.

В Idle-процедуре cтоит что-то типа

Код: Выделить всё

IF Clock() > Glo:Stop_Time
   HALT() 
END
А в тех местах, где нажали кнопку ( отслеживал Event:Accepted на уровне ABC - классов )

Код: Выделить всё

Glo:Stop_time = Clock() + 300 
На самом деле сейчас у меня в этом месте мини-планировщик, планирую действия программы. Например, закрыть верхнее окно и через 15 секунд открыть другое. Одновременное исполнение чревато аварией, а у меня как-то работает... Создаю очередь событий, а IDLE-процедура исполняет те, у которых время исполнения уже наступило
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7327
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Закрытие окна по бездействию

Сообщение Игорь Столяров »

Yufil писал(а): 28 Май 2019, 16:18IF Clock() > Glo:Stop_Time
Завязка на абсолютное время чревато катастрофой, если юзер или какая-то программа изменит системное время.
Здесь всё-таки нужно отслеживать относительный интервал отсутствия событий активности.
За теми кто отстал - не возвращаться. (С) Кодекс
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Закрытие окна по бездействию

Сообщение Yufil »

Ну да, надо какой-то сервер времени иметь. Например, можно запрашивать у SQL-сервера.
Но можно просто запомнить время прошлого тика и сравнить с временем текущего тика. Если разница по времени велика, рассчитать поправку времени и исполнять с учётом поправки
Андрей
Старожил
Сообщения: 277
Зарегистрирован: 30 Октябрь 2005, 3:58

Закрытие окна по бездействию

Сообщение Андрей »

morkovin писал(а): 28 Май 2019, 4:34 Есть готовый шаблон
#!Template for timing out windows.
#Extension(ADITimeoutWindow,'close window after seconds of inactivity'),Procedure
...
См. аттач.
Спасибо, опробовал
"close window after seconds of inactivity" - работает как кажется

а вот более сложная
"AdiTech's Timerwindow emulates Idle"
не могли бы кратенько описать - когда использовать и что за параметры
Аватара пользователя
morkovin
Ветеран
Сообщения: 908
Зарегистрирован: 20 Июль 2005, 14:53
Откуда: Volgograd, Russia
Благодарил (а): 2 раза
Поблагодарили: 3 раза
Контактная информация:

Закрытие окна по бездействию

Сообщение morkovin »

"AdiTech's Timerwindow emulates Idle"
не могли бы кратенько описать - когда использовать и что за параметры
темплейт "вешается" на окно, указываешь период и процедуру, которая и будет запускаться через этот интервал.
WBR, morkovin
Аватара пользователя
vic7tar
Ветеран
Сообщения: 365
Зарегистрирован: 09 Февраль 2017, 20:12

Закрытие окна по бездействию

Сообщение vic7tar »

morkovin писал(а): 29 Май 2019, 20:05темплейт "вешается" на окно, указываешь период и процедуру, которая и будет запускаться через этот интервал.
А интервал - это максимум 24 дня?
C10, Win10x64
Ответить