在单个Delphi应用程序中,服务器代码通知多个客户端数据更改的首选方式是什么?

我有一个大型的Delphi应用程序,其中包含我的数据的核心’服务器’代码。在同一个应用程序中,“客户端”用户能够打开和关闭多个非模态“客户端”表单来检查此数据。数据更改分为两种类型 – 主要(例如已添加删除数据的结构性更改)和次要操作(如更改数据值)。现有的开放客户端表单必须更新,以在短时间内显示已更改的数据。这不是数据库,我的’服务器’使用我自己的数据结构,所以我的解决方案可能错过了在正式的数据库结构中可用的标准技术。也就是说,我已经多次重复了我的解决方案,因为我以为我会问,是否有正式的技术,可能会改进或简化我的代码的Delphi组件。我即将迁移到多线程代码,使得这个问题更加与我相关。

我使用两种方法

>时间戳。 ‘服务器’代码保持从QueryPerformanceCounter取得的Int64值。客户端表单在300ms滴答计时器上检查此值,如果其时间戳的副本与服务器的副本不同,则进行更新。我想这是我的“拉”解决方案。
>界面通知。 ‘server’代码使用AddClient和RemoveClient方法维护一个从TInterfaceList下降的类,它注册一个简单的普通客户端通知接口。每个客户端在创建时注册此列表,并在销毁时注销。服务器上的数据更改会触发一次迭代,通过此列表调用每个客户端来建议更改。我猜这是我的“推”解决方案。

我喜欢接口和解决方案2似乎很好,因为它吸引了滴答作响的计时器,并且很容易调试(尽管注销调用可能会与销毁顺序有关)。也有潜在的性能影响,因为它很可能每秒可能有数千个数据更改,我必须小心使用BeginUpdate / EndUpdate机制将我的许多服务器数据更改转换为一个实际的通知调用。最终,我最终需要一种定时器来将呼叫聚合成一个温和的更新显示窗体。

两个解决方案都能很好地工作,而且我在两者之间撕裂了。对于一个多线程的解决方案,我确定还有其他的陷阱,我一无所知。任何意见将不胜感激。我使用XE2。

解决方法

当客户数量增加时,您需要考虑到您想要发生的事情,然后在两种罪恶之间作出决定:

>如果我的性能下降,同时确保所有数据是当前的,始终在应用程序中的任何地方(然后您需要观察者模式)
>如果某些地方的数据落后以提高性能(那么您可以使用轮询并使轮询迭代导致太多减速时间间隔更长)就可以了

我不是轮询的粉丝,因为它通常会导致非常复杂的解决方案(至少我尝试的东西,也许我当时做错了)。

我将使用界面在Delphi中实现Observer Pattern,您可以使用thisthis作为开始。

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...