uniGUI试用笔记(一)
uniGUI試用筆記(一)
通過向?qū)?chuàng)建一個(gè)uniGUI應(yīng)用服務(wù)器,工程中有三個(gè)文件:
TUniServerModule = class(TUniGUIServerModule)TUniMainModule = class(TUniGUIMainModule)TMainForm = class(TUniForm)(1)采用了單例模式,所有客戶端共用一個(gè)TUniServerModule實(shí)例對象,從下面代碼可以看出:
function UniServerModule: TUniServerModule;implementation{$R *.dfm}usesUniGUIVars;function UniServerModule: TUniServerModule; beginResult:=TUniServerModule(UniGUIServerInstance); end;initialization RegisterServerModuleClass(TUniServerModule);?
用全局變量UniGUIServerInstance實(shí)現(xiàn)了唯一化的TUniServerModule實(shí)例對象,可以視同為全局控制對象,將一些需要唯一化的對象構(gòu)建在TUniGUIServerModule類中,比如可以考慮構(gòu)建數(shù)據(jù)庫連接池,如果有必要也可以構(gòu)建對象池。
(2)每個(gè)客戶端連接后,系統(tǒng)創(chuàng)建了一個(gè)TUniMainModule對象,用于支撐和管理每個(gè)客戶端連接,實(shí)現(xiàn)機(jī)理由于沒有源碼還暫時(shí)看不出,其實(shí)例的獲取代碼如下:
function UniMainModule: TUniMainModule;implementation{$R *.dfm}usesUniGUIVars, ServerModule, uniGUIApplication;function UniMainModule: TUniMainModule; beginResult := TUniMainModule(UniApplication.UniMainModule) end;?
通過全局變量UniApplication的屬性UniMainModule實(shí)現(xiàn)對TUniMainModule實(shí)例對象的調(diào)用,如何區(qū)分不同客戶端連接的還不清楚。類的注冊代碼如下:
initializationRegisterMainModuleClass(TUniMainModule);TUniGUIMainModule實(shí)例視同每個(gè)連接的控制對象,可以將數(shù)據(jù)庫連接和數(shù)據(jù)集放在該類中,如果數(shù)據(jù)集非常多,也可以考慮動態(tài)創(chuàng)建多個(gè)TDataModule,并由TUniGUIMainModule實(shí)例進(jìn)行管理和維護(hù)。如果是三層結(jié)構(gòu),則TSQLConnection也應(yīng)放在這個(gè)Module中。
(3)主窗體是一個(gè)TUniForm類,且是一個(gè)Application構(gòu)建的窗體,通過注冊實(shí)現(xiàn),如下:
function MainForm: TMainForm;implementation{$R *.dfm}usesuniGUIVars, MainModule, uniGUIApplication;function MainForm: TMainForm; beginResult := TMainForm(UniMainModule.GetFormInstance(TMainForm)); end;通過以下代碼進(jìn)行注冊
initializationRegisterAppFormClass(TMainForm);所有Application構(gòu)建窗體都是通過上述方式實(shí)現(xiàn),由Application控制其生命周期。也可以自定義Free窗體,自己控制窗體的創(chuàng)建和釋放。
總之,可以將TUniServerModule實(shí)例對象視作全局控制對象,TUniMainModule對象視作每個(gè)連接控制對象,第一個(gè)注冊的TUniForm類Application窗體為主窗體。
(4)對每個(gè)連接線程的訪問可以通過UniServerModule.SessionManager.Sessions獲取并作進(jìn)一步處理,如下:
procedure TUniMainModule.UniGUIMainModuleCreate(Sender: TObject); varI : Integer;ASessionList: TList;ASession : TUniGUISession; begin{ 鎖定列表 }ASessionList := UniServerModule.SessionManager.Sessions.SessionList.LockList;try{ 訪問每個(gè)線程 }for I := 0 to ASessionList.Count-1 dobeginASession := TUniGUISession(ASessionList[I]);if not ASession.IsTerminated then{ 進(jìn)行處理,如客戶端地址 ASession.UniApplication.RemoteAddress }end;finally{ 釋放列表 }UniServerModule.SessionManager.Sessions.SessionList.UnlockList;end; end;也可以在TUniMainModule實(shí)例或TUniForm實(shí)例中直接訪問當(dāng)前線程對象,如:
procedure TUniMainModule.UniGUIMainModuleDestroy(Sender: TObject); varstrClientIP : String; beginstrClientIP := UniSession.UniApplication.RemoteAddress;{ 進(jìn)一步處理 } end;轉(zhuǎn)載于:https://www.cnblogs.com/yerongtian/p/11112489.html
總結(jié)
以上是生活随笔為你收集整理的uniGUI试用笔记(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ~~做过的好玩的题~~
- 下一篇: 洛谷 P1242 新汉诺塔