Данная статья посвящена сессиям в UniGUI и о том как их продлить до бесконечности либо до отключения пользователем. Этот пример основан на одном из Demo, которая идет вместе с проектом. Если ничего не сделать, то по истечении SessionTimeout на сервере, мы получим вот такое сообщение на клиенте
Скажу честно, механизм сессий в UniGUI для меня до сих пор остается загадкой. Я задал вопрос на официальном форуме и получил следующий ответ. Сессия это канал коммуникации между сервером и клиентом. Скажем, если мы сохраняем какую-то переменную на сервере, то она доступна до тех пор, пока сессия не закроется.
Время сессии конечно, и определяется в UniServerModule –> SessionTimeout. При закрытии окна браузера сессия также закрывается. Может так получиться, что время сессии кончилось, а пользователю приложение ещё необходимо))) Как избежать этого – посмотрим в данной статье.
Соберем вот такой проект…
Приложение будет работать и измерять время своей работы. Я тестировал его и у меня оно работало порядка 15 часов, дальше просто устал)))
Кнопка Test это проверка работоспособности приложения – она просто выводит сообщение.
1 2 3 4 |
procedure TMainForm.UniButton1Click(Sender: TObject); begin showmessage('Working'); end; |
Сам код работает следующим образом
MainModule
1 2 3 4 5 6 7 8 9 10 11 12 |
type TUniMainModule = class(TUniGUIMainModule) procedure UniGUIMainModuleSessionTimeout(ASession: TObject; var ExtendTimeOut: Integer); private { Private declarations } public { Public declarations } AllowTerminate:Boolean; // <<<Дописываем переменную end; |
MainModule OnSessionTimeOut
1 2 3 4 5 6 7 8 |
procedure TUniMainModule.UniGUIMainModuleSessionTimeout(ASession: TObject; var ExtendTimeOut: Integer); begin if not AllowTerminate then begin ExtendTimeOut:=15000; // extend session for another 15 seconds end; end; |
А ларчик просто открывался! Мы просто перед закрытием сессии – каждый раз её продлеваем на 15 секунд. Вот и всё, что нужно было сделать!
Теперь посмотрим на код главной формы
MainForm
Добавим глобальную переменную
1 |
var StartTime:TTime; |
Таймер я обработал следующим образом
1 2 3 4 |
procedure TMainForm.UniTimer1Timer(Sender: TObject); begin UniLabel1.Text:=timetostr(Now-StartTime); end; |
Включение таймера при создании, то есть так…
1 2 3 4 5 |
procedure TMainForm.UniFormCreate(Sender: TObject); begin StartTime:=Now; UniTimer1.Enabled:=true; end; |
А чекбокс – таким образом
1 2 3 4 5 6 7 8 |
procedure TMainForm.UniCheckBox1Click(Sender: TObject); begin UniMainModule.AllowTerminate:=UniCheckBox1.Checked; if UniMainModule.AllowTerminate then Self.Caption:='true' else Self.Caption:='false'; end; |
Кнопку bTerminate таким образом
1 2 3 4 |
procedure TMainForm.bTerminateClick(Sender: TObject); begin UniSession.Terminate('Terminated'); end; |