我有一个大型的Delphi应用程序,其中包含我的数据的核心’服务器’代码。在同一个应用程序中,“客户端”用户能够打开和关闭多个非模态“客户端”表单来检查此数据。数据更改分为两种类型 – 主要(例如已添加或删除数据的结构性更改)和次要操作(如更改数据值)。现有的开放客户端表单必须更新,以在短时间内显示已更改的数据。这不是数据库,我的’服务器’使用我自己的数据结构,所以我的解决方案可能错过了在正式的数据库结构中可用的标准技术。也就是说,我已经多次重复了我的解决方案,因为我以为我会问,是否有正式的技术,可能会改进或简化我的代码的Delphi组件。我即将迁移到多线程代码,使得这个问题更加与我相关。
我使用两种方法:
>时间戳。 ‘服务器’代码保持从QueryPerformanceCounter取得的Int64值。客户端表单在300ms滴答计时器上检查此值,如果其时间戳的副本与服务器的副本不同,则进行更新。我想这是我的“拉”解决方案。
>界面通知。 ‘server’代码使用AddClient和RemoveClient方法维护一个从TInterfaceList下降的类,它注册一个简单的普通客户端通知接口。每个客户端在创建时注册此列表,并在销毁时注销。服务器上的数据更改会触发一次迭代,通过此列表调用每个客户端来建议更改。我猜这是我的“推”解决方案。
我喜欢接口和解决方案2似乎很好,因为它吸引了滴答作响的计时器,并且很容易调试(尽管注销调用可能会与销毁顺序有关)。也有潜在的性能影响,因为它很可能每秒可能有数千个数据更改,我必须小心使用BeginUpdate / EndUpdate机制将我的许多服务器数据更改转换为一个实际的通知调用。最终,我最终需要一种定时器来将呼叫聚合成一个温和的更新显示窗体。
两个解决方案都能很好地工作,而且我在两者之间撕裂了。对于一个多线程的解决方案,我确定还有其他的陷阱,我一无所知。任何意见将不胜感激。我使用XE2。