x11 Posted July 20, 2020 Posted July 20, 2020 Я взял стандартный пример и использовал в своем приложении. Задача простая: монитор сессий должен показывать какую-то дополнительную информацию, например, какое окно сейчас открыто у пользователя в браузере. Частично задача работает. Но в custom MainModule props всегда одно и то же, как будто в UniServerModule.SessionManager.Sessions ничего не меняется. На форме есть TuniTimes и каждые три секунды срабатывает процедура GetSessions(). Пользователь открывает и закрывает окна, а в свойстве "TUniMainModule(U.UniMainModule).SessionActiveForm" всегда один и тот же текст. Если закрыть фрейм TfrdSessions и снова открыть, то тогда в свойстве SessionActiveForm будет уже актуальная информация. Т.е. получается, что "S := UniServerModule.SessionManager.Sessions" не обновляется или если обновляется, то не читает custom MainModule props в частности "SessionActiveForm". procedure TfrdSessions.GetSessions; var S : TUniGUISessions; U : TUniGUISession; I : Integer; PageControl: TUniPageControl; TabSheet: TUniTabSheet; begin //cdsSessions.DisableControls; // dsSessions.DataSet := nil; // if cdsSessions.Active then // cdsSessions.Close; // если вкладка неактивна, то не обновляем данные if self.Owner is TUniTabSheet then begin TabSheet := TUniTabSheet(self.Owner); if not Assigned(TabSheet) then exit; if TabSheet.Parent is TUniPageControl then begin PageControl := TUniPageControl(TabSheet.Parent); if PageControl.ActivePage <> TabSheet then begin TabSheet.Caption := constSessionsMsgTabCaption; exit; end; end;// if TabSheet.Parent is TUniPageControl then S := UniServerModule.SessionManager.Sessions; S.Lock; // Using Lock on session manager should be used with extreme care. // We should keep the "Lock duration" as short as we can. Session Manager stops working until lock is released. // Excessive use of lock/unlock or keeping the lock active for a long period will make uniGUI server slow/unresponsive. try SetLength(ASessionList, S.SessionList.Count); // Here we do a fast copy of list to another array for later use. for I := 0 to Pred(S.SessionList.Count) do begin U := S.SessionList[I]; ASessionList[I].ASessionId := U.SessionId; ASessionList[I].AIP := U.RemoteIP; ASessionList[I].ALastTime := U.LastTimeStamp; ASessionList[I].UserAgent := U.UserAgent; if Assigned(U.UniMainModule) then // Check mainModule availability. Some sessions may not have a MainModule instance begin ASessionList[I].ALogin := TUniMainModule(U.UniMainModule).SessionUserName; // Access custom MainModule props; ASessionList[I].ActiveForm := TUniMainModule(U.UniMainModule).SessionActiveForm; ASessionList[I].DeviceInfo := TUniMainModule(U.UniMainModule).SessionDeviceType; end; end; finally S.Unlock; // ... and finally don't forget to release lock! end; //cdsSessions.DisableControls; try cdsSessions.Open; cdsSessions.EmptyDataSet; for I := Low(ASessionList) to High(ASessionList) do begin cdsSessions.Append; cdsSessions.FieldByName('sessionid').AsString := ASessionList[I].ASessionId; cdsSessions.FieldByName('ip').AsString := ASessionList[I].AIP; cdsSessions.FieldByName('lasttime').AsDateTime := ASessionList[I].ALastTime; cdsSessions.FieldByName('Login').AsString := ASessionList[I].ALogin; cdsSessions.FieldByName('ActiveForm').AsString := ASessionList[I].ActiveForm; cdsSessions.FieldByName('DeviceInfo').AsString := ASessionList[I].DeviceInfo; cdsSessions.FieldByName('UserAgent').AsString := ASessionList[I].UserAgent; cdsSessions.Post; end; if Assigned(TabSheet) then TabSheet.Caption := constSessionsMsgTabCaption; finally SetLength(ASessionList, 0); //cdsSessions.EnableControls; end; end; end; В каждой форме приложения в событии onShow я добавил строку: UniMainModule.SessionActiveForm := self.Caption; Может быть нужно выполнять как-то обновление для UniServerModule.SessionManager? Чтобы UniServerModule.SessionManager перечитывал TUniMainModule(U.UniMainModule).SessionActiveForm каждый раз, а не только при создании фрейма и при первом обращении. Quote
Dmitriy Posted October 5, 2020 Posted October 5, 2020 up, тоже интересна данная тема. Только задача проще, обновлять клиентский датасет с сервера, при определенных условиях, начал копать в сторону вэбсокетов, но пока не сильно продвинулся ) Quote
x11 Posted October 5, 2020 Author Posted October 5, 2020 38 minutes ago, Dmitriy said: обновлять клиентский датасет с сервера вы имеете ввиду, что нужно как-то посылать что-то в браузер пользователю? как-то-то "сигнал", чтобы на клиенте была запущена процедура автоматического обновления данных в сетке? Quote
stas Posted October 6, 2020 Posted October 6, 2020 Дмитрий, тут касательно сокетов уже столько, уже не знаю, сколько это обсасывать можно, посмотрите мой пример, посмотрите обсуждение. Quote
Sherzod Posted October 18, 2020 Posted October 18, 2020 On 7/20/2020 at 2:14 PM, x11 said: Я взял стандартный пример и использовал в своем приложении. Задача простая: монитор сессий должен показывать какую-то дополнительную информацию, например, какое окно сейчас открыто у пользователя в браузере. Частично задача работает. Но в custom MainModule props всегде одно и то же, как будто в UniServerModule.SessionManager.Sessions ничего не меняется. На форме есть TuniTimes и каждве три секунды срабатывает процедура GetSessions(). Пользователь открывает и закрывает окна, а в свойстве "TUniMainModule(U.UniMainModule).SessionActiveForm" всегда один и то же текст. Если закрыть фрейм TfrdSessions и снова открыть, то тогда в свойстве SessionActiveForm будет уже актуальная информация. Т.е. получается, что "S := UniServerModule.SessionManager.Sessions" не обновляется или если обновляется, то не читает custom MainModule props в частности "SessionActiveForm". Я попробую проанализировать Ваш вопрос. Прикрепите тестовый случай, если возможно... Quote
x11 Posted October 18, 2020 Author Posted October 18, 2020 Вот пытаюсь создать тестовый случай. Открыл поставляемый с uniGUI пример "\Demos\Desktop\Session List", а скомпилировать его не удается Quote [dcc32 Error] Main.pas(107): E2003 Undeclared identifier: 'UnBusy' Delphi Rio, uniGUI 1537 Quote
Sherzod Posted October 18, 2020 Posted October 18, 2020 12 minutes ago, x11 said: Quote [dcc32 Error] Main.pas(107): E2003 Undeclared identifier: 'UnBusy' Мы это исправим. На данный момент Вы можете использовать следующий подход: 1. Uses ... uniGUIApplication; 2. type THS = class(TUniGUISession) end; 3. THS(SS).SetUnBusy; Quote
x11 Posted October 18, 2020 Author Posted October 18, 2020 Перепроверил только что рабочий проект и проблемы нет странно так что пока отбой... если снова проявится, я отправлю тестовый пример 1 Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.