powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Application Idle Time
25 сообщений из 35, страница 1 из 2
Application Idle Time
    #39694526
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как грамотно реализовать сабж?

Суть проста: требуется чтобы приложение, если пользователь не совершает с ним активных действий, через минут 10 само отключалось от сервера БД. На данный момент придумал сделать счётчик, который увеличивается по таймеру на 1 каждую секунду, по достижении значения в 600 - отключаемся. Если в Application.OnMessage приходит WM_MOUSE* или WM_KEY* сообщение, то счётчик обнуляется.

Но, возможно, есть более грамотный подход?
...
Рейтинг: 0 / 0
Application Idle Time
    #39694537
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В сервере БД настраивается время жизни подключения простоя... и в строке подключения вроде бы тоже...
...
Рейтинг: 0 / 0
Application Idle Time
    #39694539
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
X-CiteВ сервере БД настраивается время жизни подключения простоя... и в строке подключения вроде бы тоже...Простой соединения с БД и простой GUI - разные вещи.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694540
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя в FireDAC в его Pooling'е как раз так и реализовано... Есть таймаут не бездействие.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694542
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpНо, возможно, есть более грамотный подход?Таймер на 600 сек.
При необходимости - продляется.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694565
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Устанавливаем время последней активности в 0.
2. Запускаем таймер на 10 минут.
3. При приходе сообщений обновляем время последней активности текущим временем
4. При срабатывании таймера проверяем, сколько прошло времени с момента последней активности. Если больше 10 минут, то рвем соединение. Если меньше, то запускаем таймер на оставшееся время и переходим к пункту 3
...
Рейтинг: 0 / 0
Application Idle Time
    #39694576
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

можно по таймеру вызывать функцию

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function IsUserActive(MS: dword): boolean;
var
  liInfo: TLastInputInfo;
begin;
  liInfo.cbSize:=SizeOf(TLastInputInfo);
  GetLastInputInfo(liInfo);
  Result:=(GetTickCount-liInfo.dwTime<MS);
  end;
...
Рейтинг: 0 / 0
Application Idle Time
    #39694579
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

туплю, если для конкретного приложения, то не подойдет
...
Рейтинг: 0 / 0
Application Idle Time
    #39694591
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: pascal
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
unit LastAppInputHook;

interface

uses
  Windows;

function GetLastAppInputTick: dword;
function IsAppIdle(ms: dword): boolean;

implementation

var
  MouseHook: HHook= 0;
  KeyboardHook: HHook= 0;
  LastHookTick: dword= 0;

function GetLastAppInputTick: dword;
begin;
  Result:=LastHookTick;
  end;

function IsAppIdle(ms: dword): boolean;
begin;
  Result:=(GetTickCount-LastHookTick>=ms);
  end;

function MouseProc(Code, wParam, lParam: integer): integer; stdcall;
begin;
  Result:=CallNextHookEx(MouseHook, Code, WParam, LParam);
  LastHookTick:=GetTickCount;
  end;

function KeyboardProc(Code, wParam, lParam: integer): integer; stdcall;
begin;
  Result:=CallNextHookEx(KeyboardHook, Code, WParam, LParam);
  LastHookTick:=GetTickCount;
  end;

procedure Hook;
begin;
  MouseHook   :=SetWindowsHookEx(WH_MOUSE,    MouseProc,    0, GetCurrentThreadID);
  KeyboardHook:=SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, 0, GetCurrentThreadID);
  LastHookTick:=GetTickCount;
  end;

procedure Unhook;
begin;
  if MouseHook<>0 then UnhookWindowsHookEx(MouseHook);
  if KeyboardHook<>0 then UnhookWindowsHookEx(KeyboardHook);
  end;

initialization
  Hook;

finalization
  Unhook;

end.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694600
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksandr Sharahov,

А в чём плюс перед Application.OnMessage?..
...
Рейтинг: 0 / 0
Application Idle Time
    #39694604
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpAleksandr Sharahov,

А в чём плюс перед Application.OnMessage?..

В принципе равноценно.

Есть пара небольших плюсов:
1. У меня OnMessage и так перегружен другой работой - а тут функциональное разделение.
2. Через код возврата в хуках можно блокировать любой ввод пользователя на время выполнения команды.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694607
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpAleksandr Sharahov,

А в чём плюс перед Application.OnMessage?..Тем что можно просто заюзать модуль и все.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694653
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpесли пользователь не совершает с ним активных действий
Как определить что пользователь НЕ СОВЕРШАЕТ активных действий ?
Если бухгалтер сравнивает данные с картинкой на экране, при этом не двигает мышкой а пересчитывает данные на калькуляторе, она совершает активные действия ?
Или открыла Косынку и перекладывает картишки, то совершает активные действия ?
...
Рейтинг: 0 / 0
Application Idle Time
    #39694662
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBralekcvpесли пользователь не совершает с ним активных действий
Как определить что пользователь НЕ СОВЕРШАЕТ активных действий ?
Если бухгалтер сравнивает данные с картинкой на экране, при этом не двигает мышкой а пересчитывает данные на калькуляторе, она совершает активные действия ?
Или открыла Косынку и перекладывает картишки, то совершает активные действия ?
Обычно в объекте, инкапсулирующем соединение с базой, доступно событие типа "запрос к базе". Ну вот, если приложение обменивалось чем-то с базой в течении последних ххх секунд, оно "активно". Иначе - юзер балуется. Например.
...
А зачем сие вообще надо? Попытка сэкономить на лицензиях?
...
Рейтинг: 0 / 0
Application Idle Time
    #39694678
L_argo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну вот, если приложение обменивалось чем-то с базой в течении последних ххх секунд, оно "активно".В приложении может работать к-л таймер с зачиткой с базы. Н-р зачитка информационных сообщений пользователям.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694713
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КотовасияА зачем сие вообще надо? Попытка сэкономить на лицензиях?
В целях безопасности. Приложение хранит логины/пароли к сервисам, некоторые, не особо ответственные товарищи, посмотрев нужное оставляют его открытым - подходи кто хочешь, смотри что хочешь. Хочу сделать таймаут минут 5-10, если не смотришь в приложение, то оно от базы отключается и надо логиниться заново.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694724
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Повторяю, как определить что пользователь не работает ?
...
Рейтинг: 0 / 0
Application Idle Time
    #39694729
Aleksandr Sharahov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBr,

достаточно хайли лайкли
...
Рейтинг: 0 / 0
Application Idle Time
    #39694731
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrИли открыла Косынку и перекладывает картишки, то совершает активные действия ?
Тогда инпут в программу и не придет.
По сабжу - нормальная идея. Я бы тоже сделал через App.OnMessage. Но вообще неплохо бы протестировать нововведение "на кошках". Потому что если в программе не зависают ежесекундно, а обращаются время от времени, разлогин через 10 минут будет жутко бесить.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694733
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBrПовторяю, как определить что пользователь не работает ?
Если он 5 минут не водит мышкой над формами приложения и не нажимает никакие кнопки - этого достаточно. Там нет столько информации, чтобы её читать 5 минут не трогая ничего.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694735
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2 Потому что если в программе не зависают ежесекундно, а обращаются время от времени, разлогин через 10 минут будет жутко бесить.
Я думаю он будет бесить меньше, чем проблемы в случае утечки на сторону конфиденциальных данных.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694742
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 2разлогин через 10 минут будет жутко бесить
Это можно регулировать опционально. В одном МИСе, с которым мне приходилось работать , приклада вообще закрывалась после 20 мин простоя (т.е., если ты не двигал мышом при ее активном главном окне).

По сабжу, а нельзя административно просто настроить скринсейвер юзеру, чтобы требовал пароль при повторном входе?
...
Рейтинг: 0 / 0
Application Idle Time
    #39694803
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpЕсли он 5 минут не водит мышкой над формами приложения и не нажимает никакие кнопки - этого достаточно. Там нет столько информации, чтобы её читать 5 минут не трогая ничего.
Бабушка пересчитывает на калькуляторе табличку с экрана, которая автоматически медленно сколируется, и досчитав до середины обнаруживает разрыв соединения.
...
Рейтинг: 0 / 0
Application Idle Time
    #39694814
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у нас сделано на AppOnMessage
примерно так:
if (Msg.Message = WM_CHAR)
or (Msg.Message = WM_KEYDOWN)
or (Msg.Message = WM_KEYUP)
or (Msg.Message = WM_SYSCHAR)
or (Msg.Message = WM_SYSKEYDOWN)
or (Msg.Message = WM_SYSKEYUP)
or (Msg.Message = WM_MOUSEACTIVATE)
or (Msg.Message = WM_MOUSEWHEEL)
or (Msg.Message = WM_LBUTTONDOWN)
or (Msg.Message = WM_RBUTTONDOWN)
then
tmrIdle.Enabled := false;

но обрубаем коннекты по таймеру только после "окончания рабочего дня".
чтоб не болтались бесхозные коннекты когда нужно провести регламентные работы.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Application Idle Time
    #39694823
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DimaBralekcvpЕсли он 5 минут не водит мышкой над формами приложения и не нажимает никакие кнопки - этого достаточно. Там нет столько информации, чтобы её читать 5 минут не трогая ничего.
Бабушка пересчитывает на калькуляторе табличку с экрана, которая автоматически медленно сколируется, и досчитав до середины обнаруживает разрыв соединения.
"Ничего, сынок, я тебе в курилке уже на спину плюнула"
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Application Idle Time
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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