Jump to content

Recommended Posts

Posted

Я взял стандартный пример и использовал в своем приложении.

Задача простая: монитор сессий должен показывать какую-то дополнительную информацию, например, какое окно сейчас открыто у пользователя в браузере.

Частично задача работает. Но в 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 каждый раз, а не только при создании фрейма и при первом обращении.

  • 2 months later...
Posted

up, тоже интересна данная тема. Только задача проще, обновлять клиентский датасет с сервера, при определенных условиях, начал копать в сторону вэбсокетов, но пока не сильно продвинулся )

Posted
38 minutes ago, Dmitriy said:

обновлять клиентский датасет с сервера

вы имеете ввиду, что нужно как-то посылать что-то в браузер пользователю? как-то-то "сигнал", чтобы на клиенте была запущена процедура автоматического обновления данных в сетке?

Posted

Дмитрий, тут касательно сокетов уже столько, уже не знаю, сколько это обсасывать можно, посмотрите мой пример, посмотрите обсуждение.

  • 2 weeks later...
Posted
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".

Я попробую проанализировать Ваш вопрос. Прикрепите тестовый случай, если возможно...

Posted

Вот пытаюсь создать тестовый случай.

Открыл поставляемый с uniGUI пример "\Demos\Desktop\Session List", а скомпилировать его не удается

Quote

[dcc32 Error] Main.pas(107): E2003 Undeclared identifier: 'UnBusy'

Delphi Rio, uniGUI 1537

Posted
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;

 

Posted

Перепроверил только что рабочий проект и проблемы нет :unsure2: странно

так что пока отбой...

если снова проявится, я отправлю тестовый пример

  • Upvote 1

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...