Bri*_*ost 21 delphi notifications
我有一个大的Delphi应用程序,其中包含包含我的数据的核心"服务器"代码.在同一个应用程序"客户端"中,用户可以打开和关闭多个非模态"客户端"表单来检查此数据.数据更改分为两种类型 - 主要(例如,已添加或删除数据等结构更改)和较小的数据更改(例如数据值的更改).现有的开放客户端表单必须更新以在短时间内显示已更改的数据.这不是一个数据库,我的"服务器"使用我自己的数据结构,所以我的解决方案可能错过了正式数据库结构中可用的标准技术.也就是说,我已经多次重复我的解决方案了,我想我会问是否有正式的技术和可能的Delphi组件可以改进或简化我的代码.我即将转向多线程代码,这使得这个问题对我来说更加相关.
我用两种方法:
时间戳.'server'代码维护从QueryPerformanceCounter获取的Int64值.客户端表单在300ms滴答计时器上检查此值,并在时间戳的副本与服务器的副本不同时自行更新.我想这是我的'拉'解决方案.
界面通知.'server'代码使用AddClient和RemoveClient方法维护一个来自TInterfaceList的类,该方法注册一个简单的公共客户端通知接口.每个客户端在创建时都会使用此列表进行注册,并在销毁时取消注册.服务器上的数据更改通过此列表触发迭代,调用每个客户端以告知其更改.我想这是我的"推动"解决方案.
我喜欢接口和解决方案2看起来不错,因为它避免了滴答计时器并且很容易调试(虽然取消注册调用可能会出现故障排序的问题).还有潜在的性能影响,因为很可能每秒可能有数千个数据更改,我必须小心使用BeginUpdate/EndUpdate机制将我的许多服务器数据更改转换为一个实际的通知调用.最终,我最终需要某种计时器来将调用聚合成一个显示形式的温和更新.
这两种解决方案都很好用但我在两者之间挣扎.对于一个多线程的解决方案,我确信还有其他一些我一无所知的陷阱.任何意见将不胜感激.我正在使用XE2.
当客户数量增长时,你需要考虑你想要发生什么,然后在两个邪恶之间做出决定:
我不是民意调查的粉丝,因为它通常会导致非常复杂的解决方案(好吧,至少我尝试过的东西,也许我当时做错了).
我将使用接口在Delphi中实现Observer模式,您可以使用this或this作为开始.