經過嚮導建立一個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;