powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / idle
18 сообщений из 18, страница 1 из 1
idle
    #36663486
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно сделать какие-то действия, если юзер не работал 30 минут. После этого, если он не работал час // idle(3600) - закрыть прогу. Но если после 30 минут юзер вернулся к проге, то нужно сбросить снова на 30 минут // idle(1800). Как такое сделать?
...
Рейтинг: 0 / 0
idle
    #36663806
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где? В БД, в программе?
Точнее надо изложить проблему
...
Рейтинг: 0 / 0
idle
    #36663857
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001,
В программе.
Объясняю: клиент открыл окно, поставил курсор в поле и написал буковку "А". Сидит, ковыряется в носу. Через полчаса нужно сохранить эту буковку в файлик и засечь час. Если клиент не вернется к работе, то его нужно выплюнуть из проги. Если он через 40 минут нажмет на буковку "Б", то нужно вновь засечь полчаса и т.д.
Я думаю, что такое нельзя реализовать. Очень надеюсь, что ошибаюсь.
...
Рейтинг: 0 / 0
idle
    #36663871
PaulJB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое сделать возможно.
По моему, в хелпе на ф-цию idle() все доходчиво написано ...
...
Рейтинг: 0 / 0
idle
    #36663906
Фотография Ikar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska...
Я думаю, что такое нельзя реализовать. Очень надеюсь, что ошибаюсь.ИМХО, реализовать то можно... И, как правильно сказано выше, PaulJB...
в хелпе на ф-цию idle() все доходчиво написано ...

Хуже того, можно это и без idle() сделать. Извращение еще то, но нет ничего невозможного. Ибо, как гласит бородатый девиз - "не бывает нерешаемых задач, бывают не подписанные бюджеты".

Я бы прикидывал примерно так.
Во первых - во всем приложении ни одного "чистого" объекта, с которым может контактировать пользователь, все - юзеробжекты унаследованные от нужных контролов. Ну, за исключением лейблов и групбоксов, пожалуй, с картинками. Хотя - тоже не факт.

Во вторых - во всех контролах-юзеробжектах на любой "чих" пользователя - клик, нажатие кнопки, (а где-то, может быть даже, моусмув и скролл) и т.п. - вызов некоего объекта, реализующего необходимый таймер + ссылка на объект (контрол) его вызвавший + функция, реализующая запись буковок в файл и прочая, с конкретикой под, собственно, сам контролл

Ну и в третьих - большой глобальный nvo который создается на старте приложения и на каждый его "пинок" от контролла сбрасывает таймер на ноль и начинает считать снова, а по достижению порогового времени (имея ссылку на "пнувший" его контролл) в обратку "пинает" контролл и вызывает его функцию (см. во вторых). После чего запускает второй таймер по достижению которого стопает приложение.

В общем как то так... Т.е. если закладывать такое на этапе проектирования приложения - еще ничего, можно побаловаться, а вот если такое встраивать в приложение имеющееся - тушите свет и готовьте бабки для фактического переписывания приложения с нуля...

Кстати, думаю, и при использовании idle() кое-что из вышесказанного тоже сделать придется...

Все вышесказанное - чистейшее ИМХО и продукт задурманенного антиаллергическими препаратами мозга )))
...
Рейтинг: 0 / 0
idle
    #36663962
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Ikar
+100
Где-то примерно так, другой вопрос если засечь какую-то определенную функцию...
...
Рейтинг: 0 / 0
idle
    #36664070
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska ,
где-то так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
/*instance variable*/
integer ii_idle= 0 
time starttime

/*в событиии Open приложения*/
Idle(  1800 )

/*в событиии Idle приложения*/
ii_idle ++
if ii_idle= 1  then
  GOTO Stp_1
else
  if SecondsAfter( StartTime, Now()) >=  3600  then
    if ii_idle= 3  then
      ... /*делаються какие-то действия*/
      HALT CLOSE /*закрываем программу*/
    else
      GOTO Stp_1 /*перезапуск*/
    end if
  else
    GOTO Stp_1 /*перезапуск*/
  end if
end if

RETURN

Stp_1:
    ... /*делаються какие-то действия*/
    starttime = Now() /*фиксируем время*/
    ii_idle= 1  /*флаг 1-го события*/
...
Рейтинг: 0 / 0
idle
    #36664199
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,
В этом направлении сейчас и рисую. Не совсем так, но идея проверять время должна сработать. Допишу - скину. Спасибо.
...
Рейтинг: 0 / 0
idle
    #36664506
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RiskaAIS,
...Не совсем так...
Почему не так?
Помоему скрипт имеет необходимых два порога срабатывания (весь процесс - три фазы по 1800 сек.) и + реагирует "перезапуском" на действия пользователя после первой фазы (т.е. во время 2 и 3 фазы), когда он мог начать работать и работал какое-то время (например, как 5 час.(1-й перезапуск) так и 5 мин. (2-й перезапуск)). Ну, и есть два места где можно вставить действие программы на 1-ю фазу (т.е. после первых 30 мин.) и на 3-ю фазу (после 1 часа до закрытия программы).
...
Рейтинг: 0 / 0
idle
    #36665694
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,
На втором заходе мы не можем знать проснулся клиент, или просто прошло полчаса.
...
Рейтинг: 0 / 0
idle
    #36666492
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RiskaAIS,
На втором заходе мы не можем знать проснулся клиент, или просто прошло полчаса.
тогда так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
/*instance variable*/
integer ii_idle= 0 
time starttime

/*в событиии Open приложения*/
Idle(  1800 )

/*в событиии Idle приложения*/
long ll_sec

ii_idle ++
if ii_idle= 1  then
  GOTO Stp_1
else
  ll_sec = SecondsAfter( StartTime, Now())
  Choose Case ii_idle
    Case  3 
       /*тест: была ли активность в 3-й фазе*/
       if ll_sec >  3600  then
          GOTO Stp_1 /*была активность => перезапуск*/
       else
          ... /*делаються какие-то действия*/
          HALT CLOSE /*закрываем программу*/
       end if
    Case  2 
       /*тест: была ли активность во 2-й фазе*/
       if ll_sec >  1800  then
          GOTO Stp_1 /*была активность => перезапуск*/
       end if
  End Choose
end if

RETURN

Stp_1:
    ... /*делаються какие-то действия*/
    starttime = Now() /*фиксируем время*/
    ii_idle= 1  /*флаг 1-го события*/

Прим.:
1-я фаза - пользователь спал 30 мин. /1-е срабатывание события Idle/
2-я фаза - пользователь спал ещё 30 мин. /2-е срабатывание события Idle/.
3-я фаза - пользователь спит ещё 30 мин. /3-е срабатывание события Idle/.

Во 2-й и 3-й фазах любая активность пользователя приведет к несовпадению пороговых значений интервала времени и включится "перезапуск", и неважно сколько он активничал.
...
Рейтинг: 0 / 0
idle
    #36667383
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,
Вот это работает:
idle(10) // только для проверки. Должно быть 1800

/*instance variable*/
datetime idt_last_click

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Long   ll_seconds_after
time lt_now

lt_now = now()

ll_seconds_after = DaysAfter(date(idt_last_click), Today()) *  24  *  60  *  60  + &
		SecondsAfter(time(idt_last_click), lt_now)

CHOOSE CASE ll_seconds_after
 CASE   10  //  1800  - second time
       //...........
 CASE   20  //  3600  - Third time
      //...........
      Halt Close
      Return
 CASE ELSE // first time
      //..........
      idt_last_click = datetime(Today(), lt_now) 
END CHOOSE
...
Рейтинг: 0 / 0
idle
    #36667589
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska ,
прошу прощения за назойливость, но есть две мысли в слух:
- не совсем понятно зачем Вы добавили дату, когда достаточно секунд. Это и проще, и не будет критической ситуации при переходя дня через "0" часов.
- по-моему в вашем варианте не учитываются пару критических ситуаций:

1. Например, когда после 1-ых 30 минут сна пользователь снова активный 1800 сек. и снова засыпает. Тогда после 30 мин. должно сработать:
Код: plaintext
1.
2.
 CASE ELSE // first time
      //..........
      idt_last_click = datetime(Today(), lt_now)
а по факту будет совпадение и сработает это:
Код: plaintext
1.
2.
3.
  CASE   20  //  3600  - Third time
      //...........
      Halt Close
      Return
В моем варианте "Choose Case ii_idle" исключает эту "дырку". ;)

2. Попасть четко на пороговые значения может не удасться, т.к. между временем срабатывания события Idle и временем "Теста на сравнение" в скрипте может быть реальная t-задержки (если не из-за задержки работы ПО, то из-за перехода секунды от 59:59:59 в 00:00:00).
Хотя у меня это тоже не до конца учтено. ;)
...
Рейтинг: 0 / 0
idle
    #36671549
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,
1. Тогда после 30 мин. должно сработать:
CASE ELSE // first time

Нет. Это сработает только в том случае, если клиент не проснулся (либо проснулся секунда в секунду по истечении времени - эту погрешность решено было не учитывать).

2. Попасть четко на пороговые значения удается в случае, когда клиент спит. Когда не спит - это не имеет значения.
Из-за перехода секунды от 59:59:59 в 00:00:00 нет проблемы, т.к. это обычная секунда.
...
Рейтинг: 0 / 0
idle
    #36671570
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Riska,
Забыл добавить:
не совсем понятно зачем Вы добавили дату
Код: plaintext
SecondsAfter ( time1, time2 ) // NOT SecondsAfter ( datetime1, datetime2 )
...
Рейтинг: 0 / 0
idle
    #36672218
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RiskaAIS,
1. Тогда после 30 мин. должно сработать:
CASE ELSE // first time

Нет. Это сработает только в том случае, если клиент не проснулся (либо проснулся секунда в секунду по истечении времени - эту погрешность решено было не учитывать).
Да, он проснулся секунда в секунду (1800), и поверение программы совсем другое от прогнозированного. Лучше скорректировать код, чем пренебречь тем, что может вызвать критическую ошибку либо потерю данных.

Когда клиент не спит, то действительно всё по барабану. Но когда он снова заснул, система должна отработать все три фазы, а она может проигнорировать Ваши заложенные действия при случайном совпадении значений.

Вы полагаете, что система будет всегда четко попадать на пороговые значения?
По-моему, пренебрегая малым Вы не видите бо'льшего.
...
Рейтинг: 0 / 0
idle
    #36672381
Фотография Riska
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,
А у нас нет выхода. Либо кодячить на всех событиях в программе, либо дать шанс клиенту два раза секунда в секунду нажать на кнопочку и больше не прикасаться к проге (после первого раза ничего страшного не происходит - мы просто сохраняем данные в файл. Программа закроется только после третьего захода в idle).

Вы полагаете, что система будет всегда четко попадать на пороговые значения?
Секунда - более чем достаточная погрешность (мы проверяем секунды, а не доли секунд). Когда прога спит и не происходит никаких телодвижений мы не промахнемся.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
idle
    #37676164
umalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так же возникла необходимость определения активности пользователя. Причём нужно определять работает ли он вообще в данный момент - т.е. наша программа запущена обязательно и мониторим по таймеру. Пользователь может работать в другой программе, а может нигде не работать. Для определения активности пользователя - нашёл функцию, которая возвращает когда было принято последний раз действие от пользователя.
Function Boolean GetLastInputInfo ( ref ST_LASTINPUTINFO plii) Library "USER32.DLL"
Меня устраивает в полной мере. Теперь могу как Messendger определить как долго не работает пользователь за компьютером.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / idle
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]