Закрытие окна по бездействию
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Закрытие окна по бездействию
Прошу подсказать как реализовать автозакрытие окна по бездействию пользователя (в данном случае только клава) ?
Например Timer=60 c., если ничего не нажимается - окно закрывается, если нажата любая клавиша - таймер надо сбросить в 0.
Например Timer=60 c., если ничего не нажимается - окно закрывается, если нажата любая клавиша - таймер надо сбросить в 0.
- morkovin
- Ветеран
- Сообщения: 909
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Закрытие окна по бездействию
Есть готовый шаблон
См. аттач.#!Template for timing out windows.
#Extension(ADITimeoutWindow,'close window after seconds of inactivity'),Procedure
...
- Вложения
-
- ADIIdle.tpl
- (3.33 КБ) 311 скачиваний
WBR, morkovin
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Закрытие окна по бездействию
Я делал без шаблона.
Код: Выделить всё
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.
Закрытие окна по бездействию
... В 12 часов по ночам
Играет сигнал "CloseWindow"
А что будет, если мы кнопками или клавишами тыкаем в другом треде? И Event:Timer портить не хочется, вдруг он мне нужен...
Я у себя пользовал IDLE, она как-то надёжнее и действует сразу на все треды. Первично в глобальной переменной устанавливается дата и время завершения, а потом при работе программы значение этой переменной передвигается. Но мне надо было останавливать не одно окно, а всю программу.
Играет сигнал "CloseWindow"
А что будет, если мы кнопками или клавишами тыкаем в другом треде? И Event:Timer портить не хочется, вдруг он мне нужен...
Я у себя пользовал IDLE, она как-то надёжнее и действует сразу на все треды. Первично в глобальной переменной устанавливается дата и время завершения, а потом при работе программы значение этой переменной передвигается. Но мне надо было останавливать не одно окно, а всю программу.
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Закрытие окна по бездействию
Я сделал под свои специфические требования. 12 часов ночи - прокол. Надо переделать. Хотя вряд ли кто попадает. Даже если и работает, 30 секунд всего даю на бездействие. А вот как IDLE прикрутить к данной задаче мне не понятно.
We are hard at work… for you.
Закрытие окна по бездействию
Примерно так
Переменная Glo:Stop_Time - время остановки программы. Если какие-то телодвижения происходят, это время сдвигается.
Если время достигнуто - завершаемся.
В Idle-процедуре cтоит что-то типаА в тех местах, где нажали кнопку ( отслеживал Event:Accepted на уровне ABC - классов )
На самом деле сейчас у меня в этом месте мини-планировщик, планирую действия программы. Например, закрыть верхнее окно и через 15 секунд открыть другое. Одновременное исполнение чревато аварией, а у меня как-то работает... Создаю очередь событий, а IDLE-процедура исполняет те, у которых время исполнения уже наступило
Переменная Glo:Stop_Time - время остановки программы. Если какие-то телодвижения происходят, это время сдвигается.
Если время достигнуто - завершаемся.
В Idle-процедуре cтоит что-то типа
Код: Выделить всё
IF Clock() > Glo:Stop_Time
HALT()
END
Код: Выделить всё
Glo:Stop_time = Clock() + 300
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Закрытие окна по бездействию
Завязка на абсолютное время чревато катастрофой, если юзер или какая-то программа изменит системное время.
Здесь всё-таки нужно отслеживать относительный интервал отсутствия событий активности.
За теми кто отстал - не возвращаться. (С) Кодекс
Закрытие окна по бездействию
Ну да, надо какой-то сервер времени иметь. Например, можно запрашивать у SQL-сервера.
Но можно просто запомнить время прошлого тика и сравнить с временем текущего тика. Если разница по времени велика, рассчитать поправку времени и исполнять с учётом поправки
Но можно просто запомнить время прошлого тика и сравнить с временем текущего тика. Если разница по времени велика, рассчитать поправку времени и исполнять с учётом поправки
Закрытие окна по бездействию
Спасибо, опробовал
"close window after seconds of inactivity" - работает как кажется
а вот более сложная
"AdiTech's Timerwindow emulates Idle"
не могли бы кратенько описать - когда использовать и что за параметры
- morkovin
- Ветеран
- Сообщения: 909
- Зарегистрирован: 20 Июль 2005, 14:53
- Откуда: Volgograd, Russia
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Закрытие окна по бездействию
темплейт "вешается" на окно, указываешь период и процедуру, которая и будет запускаться через этот интервал."AdiTech's Timerwindow emulates Idle"
не могли бы кратенько описать - когда использовать и что за параметры
WBR, morkovin