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

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

Но, возможно, есть более грамотный подход?
...
Рейтинг: 0 / 0
28.08.2018, 18:22
    #39694537
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
В сервере БД настраивается время жизни подключения простоя... и в строке подключения вроде бы тоже...
...
Рейтинг: 0 / 0
28.08.2018, 18:23
    #39694539
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
X-CiteВ сервере БД настраивается время жизни подключения простоя... и в строке подключения вроде бы тоже...Простой соединения с БД и простой GUI - разные вещи.
...
Рейтинг: 0 / 0
28.08.2018, 18:23
    #39694540
X-Cite
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
Хотя в FireDAC в его Pooling'е как раз так и реализовано... Есть таймаут не бездействие.
...
Рейтинг: 0 / 0
28.08.2018, 18:24
    #39694542
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
alekcvpНо, возможно, есть более грамотный подход?Таймер на 600 сек.
При необходимости - продляется.
...
Рейтинг: 0 / 0
28.08.2018, 19:26
    #39694565
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
1. Устанавливаем время последней активности в 0.
2. Запускаем таймер на 10 минут.
3. При приходе сообщений обновляем время последней активности текущим временем
4. При срабатывании таймера проверяем, сколько прошло времени с момента последней активности. Если больше 10 минут, то рвем соединение. Если меньше, то запускаем таймер на оставшееся время и переходим к пункту 3
...
Рейтинг: 0 / 0
28.08.2018, 19:58
    #39694576
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
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
28.08.2018, 20:08
    #39694579
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
Aleksandr Sharahov,

туплю, если для конкретного приложения, то не подойдет
...
Рейтинг: 0 / 0
28.08.2018, 21:22
    #39694591
Aleksandr Sharahov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
Код: 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
28.08.2018, 22:19
    #39694600
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
Aleksandr Sharahov,

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

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

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

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

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

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

По сабжу, а нельзя административно просто настроить скринсейвер юзеру, чтобы требовал пароль при повторном входе?
...
Рейтинг: 0 / 0
29.08.2018, 11:37
    #39694803
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
alekcvpЕсли он 5 минут не водит мышкой над формами приложения и не нажимает никакие кнопки - этого достаточно. Там нет столько информации, чтобы её читать 5 минут не трогая ничего.
Бабушка пересчитывает на калькуляторе табличку с экрана, которая автоматически медленно сколируется, и досчитав до середины обнаруживает разрыв соединения.
...
Рейтинг: 0 / 0
29.08.2018, 11:43
    #39694814
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
у нас сделано на 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
29.08.2018, 11:50
    #39694823
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Application Idle Time
DimaBralekcvpЕсли он 5 минут не водит мышкой над формами приложения и не нажимает никакие кнопки - этого достаточно. Там нет столько информации, чтобы её читать 5 минут не трогая ничего.
Бабушка пересчитывает на калькуляторе табличку с экрана, которая автоматически медленно сколируется, и досчитав до середины обнаруживает разрыв соединения.
"Ничего, сынок, я тебе в курилке уже на спину плюнула"
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Application Idle Time / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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