博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uniGUI试用笔记(一)
阅读量:5164 次
发布时间:2019-06-13

本文共 2580 字,大约阅读时间需要 8 分钟。

通过向导创建一个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;initializationRegisterServerModuleClass(TUniServerModule);

 

用全局变量UniGUIServerInstance实现了唯一化的TUniServerModule实例对象,可以视同为全局控制对象,将一些需要唯一化的对象构建在TUniGUIServerModule类中,比如可以考虑构建数据库连接池,如果有必要也可以构建对象池。

(2)每个客户端连接后,系统创建了一个TUniMainModule对象,用于支撑和管理每个客户端连接,实现机理由于没有源码还暂时看不出,其实例的获取代码如下:

function UniMainModule: TUniMainModule;implementation{
$R *.dfm}uses UniGUIVars, ServerModule, uniGUIApplication;function UniMainModule: TUniMainModule;begin Result := TUniMainModule(UniApplication.UniMainModule)end;

 

通过全局变量UniApplication的属性UniMainModule实现对TUniMainModule实例对象的调用,如何区分不同客户端连接的还不清楚。类的注册代码如下:

initialization  RegisterMainModuleClass(TUniMainModule);

TUniGUIMainModule实例视同每个连接的控制对象,可以将数据库连接和数据集放在该类中,如果数据集非常多,也可以考虑动态创建多个TDataModule,并由TUniGUIMainModule实例进行管理和维护。如果是三层结构,则TSQLConnection也应放在这个Module中。

(3)主窗体是一个TUniForm类,且是一个Application构建的窗体,通过注册实现,如下:

function MainForm: TMainForm;implementation{
$R *.dfm}uses uniGUIVars, MainModule, uniGUIApplication;function MainForm: TMainForm;begin Result := TMainForm(UniMainModule.GetFormInstance(TMainForm));end;

通过以下代码进行注册

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;

 

 

转载于:https://www.cnblogs.com/ChinaEHR/p/3999116.html

你可能感兴趣的文章
数据库取出的date类型数据在jsp页面格式化
查看>>
Python MySQL OperationalError: (1054, "Unknown column 'XX' in 'where clause'")
查看>>
IP协议
查看>>
redux、immutablejs和mobx性能对比(一)
查看>>
Java IO Demo
查看>>
winform time.AddMinutes 时间相加
查看>>
无限级菜单的实现
查看>>
android脚步---使用framelayout实现霓虹灯效果
查看>>
Configuration.ConfigurationSettings.AppSettings已过时
查看>>
Mac中的快捷键
查看>>
lua C++ wrapper
查看>>
awk 对简单文本处理试水
查看>>
react.js 多个组件集成示例
查看>>
用户故事驱动的敏捷开发 – 2. 创建backlog
查看>>
NLTK-Chapter8.4中符合语句规则的字串表-动态规划算法的解释
查看>>
AQS(AbstractQueuedSynchronizer)
查看>>
Ubuntu boot空间不足解决方法
查看>>
Linux基础命令---iostat显示设备状态
查看>>
java例程练习(多线程[join()方法])
查看>>
20155337 2016-2017-2 《Java程序设计》第三周学习总结
查看>>