uniGUI试用笔记(一)
uniGUI试用笔记(一)
通过向导创建一个uniGUI应用服务器,工程中有三个文件:
TUniServerModule = class(TUniGUIServerModule)TUniMainModule = class(TUniGUIMainModule)TMainForm = class(TUniForm)
(1)采用了单例模式,所有客户端共用一个TUniServerModule实例对象,从下面代码可以看出:
function UniServerModule: TUniServerModule;implementation{$R *.dfm}usesUniGUIVars;function UniServerModule: TUniServerModule;
beginResult:=TUniServerModule(UniGUIServerInstance);
end;initialization
RegisterServerModuleClass(TUniServerModule);
用全局变量UniGUIServerInstance实现了唯一化的TUniServerModule实例对象,可以视同为全局控制对象,将一些需要唯一化的对象构建在TUniGUIServerModule类中,比如可以考虑构建数据库连接池,如果有必要也可以构建对象池。
(2)每个客户端连接后,系统创建了一个TUniMainModule对象,用于支撑和管理每个客户端连接,实现机理由于没有源码还暂时看不出,其实例的获取代码如下:
function UniMainModule: TUniMainModule;implementation{$R *.dfm}usesUniGUIVars, ServerModule, uniGUIApplication;function UniMainModule: TUniMainModule;
beginResult := TUniMainModule(UniApplication.UniMainModule)
end;
通过全局变量UniApplication的属性UniMainModule实现对TUniMainModule实例对象的调用,如何区分不同客户端连接的还不清楚。类的注册代码如下:
initializationRegisterMainModuleClass(TUniMainModule);
TUniGUIMainModule实例视同每个连接的控制对象,可以将数据库连接和数据集放在该类中,如果数据集非常多,也可以考虑动态创建多个TDataModule,并由TUniGUIMainModule实例进行管理和维护。如果是三层结构,则TSQLConnection也应放在这个Module中。
(3)主窗体是一个TUniForm类,且是一个Application构建的窗体,通过注册实现,如下:
function MainForm: TMainForm;implementation{$R *.dfm}usesuniGUIVars, MainModule, uniGUIApplication;function MainForm: TMainForm;
beginResult := TMainForm(UniMainModule.GetFormInstance(TMainForm));
end;
通过以下代码进行注册
initializationRegisterAppFormClass(TMainForm);
所有Application构建窗体都是通过上述方式实现,由Application控制其生命周期。也可以自定义Free窗体,自己控制窗体的创建和释放。
总之,可以将TUniServerModule实例对象视作全局控制对象,TUniMainModule对象视作每个连接控制对象,第一个注册的TUniForm类Application窗体为主窗体。
(4)对每个连接线程的访问可以通过UniServerModule.SessionManager.Sessions获取并作进一步处理,如下:
procedure TUniMainModule.UniGUIMainModuleCreate(Sender: TObject);
varI : Integer;ASessionList: TList;ASession : TUniGUISession;
begin{ 锁定列表 }ASessionList := UniServerModule.SessionManager.Sessions.SessionList.LockList;try{ 访问每个线程 }for I := 0 to ASessionList.Count-1 dobeginASession := 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);
varstrClientIP : String;
beginstrClientIP := UniSession.UniApplication.RemoteAddress;{ 进一步处理 }
end;
转载于:https://www.cnblogs.com/yerongtian/p/11112489.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
