uniGUI試用筆記(一)

經過嚮導建立一個uniGUI應用服務器,工程中有三個文件:數據庫

TUniServerModule = class(TUniGUIServerModule)

TUniMainModule = class(TUniGUIMainModule)

TMainForm = class(TUniForm)

(1)採用了單例模式,全部客戶端共用一個TUniServerModule實例對象,從下面代碼能夠看出:服務器

function UniServerModule: TUniServerModule;

 implementation

 {$R *.dfm}

 uses
  UniGUIVars;

function UniServerModule: TUniServerModule;
begin
  Result:=TUniServerModule(UniGUIServerInstance);
end;

initialization
RegisterServerModuleClass(TUniServerModule);

 

用全局變量UniGUIServerInstance實現了惟一化的TUniServerModule實例對象,能夠視同爲全局控制對象,將一些須要惟一化的對象構建在TUniGUIServerModule類中,好比能夠考慮構建數據庫鏈接池,若是有必要也能夠構建對象池。spa

(2)每一個客戶端鏈接後,系統建立了一個TUniMainModule對象,用於支撐和管理每一個客戶端鏈接,實現機理因爲沒有源碼還暫時看不出,其實例的獲取代碼以下:線程

function UniMainModule: TUniMainModule;

implementation

{$R *.dfm}

uses
  UniGUIVars, ServerModule, uniGUIApplication;

function UniMainModule: TUniMainModule;
begin
  Result := TUniMainModule(UniApplication.UniMainModule)
end;

 

經過全局變量UniApplication的屬性UniMainModule實現對TUniMainModule實例對象的調用,如何區分不一樣客戶端鏈接的還不清楚。類的註冊代碼以下:code

initialization
  RegisterMainModuleClass(TUniMainModule);

TUniGUIMainModule實例視同每一個鏈接的控制對象,能夠將數據庫鏈接和數據集放在該類中,若是數據集很是多,也能夠考慮動態建立多個TDataModule,並由TUniGUIMainModule實例進行管理和維護。若是是三層結構,則TSQLConnection也應放在這個Module中。orm

(3)主窗體是一個TUniForm類,且是一個Application構建的窗體,經過註冊實現,以下:對象

function MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  uniGUIVars, MainModule, uniGUIApplication;

function MainForm: TMainForm;
begin
  Result := TMainForm(UniMainModule.GetFormInstance(TMainForm));
end;

經過如下代碼進行註冊blog

initialization
  RegisterAppFormClass(TMainForm);

全部Application構建窗體都是經過上述方式實現,由Application控制其生命週期。也能夠自定義Free窗體,本身控制窗體的建立和釋放。生命週期

總之,能夠將TUniServerModule實例對象視做全局控制對象,TUniMainModule對象視做每一個鏈接控制對象,第一個註冊的TUniForm類Application窗體爲主窗體。源碼

(4)對每一個鏈接線程的訪問能夠經過UniServerModule.SessionManager.Sessions獲取並做進一步處理,以下:

procedure TUniMainModule.UniGUIMainModuleCreate(Sender: TObject);
var
  I : Integer;
  ASessionList: TList;
  ASession : TUniGUISession;
begin
  { 鎖定列表 }
  ASessionList := UniServerModule.SessionManager.Sessions.SessionList.LockList;

  try
    { 訪問每一個線程 }
    for I := 0 to ASessionList.Count-1 do
    begin
      ASession := TUniGUISession(ASessionList[I]);
      if not ASession.IsTerminated then
        { 進行處理,如客戶端地址 ASession.UniApplication.RemoteAddress }
    end;
  finally
    { 釋放列表 }
    UniServerModule.SessionManager.Sessions.SessionList.UnlockList;
  end;
end;

也能夠在TUniMainModule實例或TUniForm實例中直接訪問當前線程對象,如:

procedure TUniMainModule.UniGUIMainModuleDestroy(Sender: TObject);
var
  strClientIP : String;
begin
  strClientIP := UniSession.UniApplication.RemoteAddress;
  { 進一步處理 }
end;
相關文章
相關標籤/搜索