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

标签 delphi notifications

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

我使用两种方法:

  1. 时间戳。 “服务器”代码维护从 QueryPerformanceCounter 获取的 Int64 值。客户端表单在 300 毫秒滴答计时器上检查此值,并在时间戳副本与服务器的副本不同时自行更新。我想这是我的“拉动”解决方案。

  2. 界面通知。 “服务器”代码维护一个从 TInterfaceList 派生的类,其中包含 AddClient 和 RemoveClient 方法,这些方法注册一个简单的公共(public)客户端通知接口(interface)。每个客户端在创建时都会向此列表注册,并在销毁时取消注册。服务器上的数据更改会触发此列表的迭代,调用每个客户端以通知其更改。我想这是我的“推送”解决方案。

我喜欢接口(interface),解决方案 2 看起来不错,因为它避免了滴答计时器并且易于调试(尽管取消注册调用可能会出现破坏顺序问题)。也存在潜在的性能影响,因为每秒很可能有数千个数据更改,并且我必须小心使用 BeginUpdate/EndUpdate 机制将我的许多服务器数据更改转换为一个实际的通知调用。最终,我最终需要某种计时器来将调用聚合到显示表单的一次温和更新中。

这两种解决方案都工作得很好,但我在两者之间左右为难。对于多线程解决方案,我确信还有其他我一无所知的陷阱。任何意见将不胜感激。我正在使用 XE2。

最佳答案

您需要考虑当客户端数量增加时您希望发生什么,然后在两害之间做出决定:

  • 如果我的性能下降,同时确保应用程序中的所有数据始终处于最新状态(那么您需要观察者模式),这可以吗
  • 如果为了提高性能,某些地方的数据滞后,可以吗(那么可以使用轮询,当轮询迭代导致速度过慢时,可以将间隔拉长)

我不喜欢民意调查,因为它通常会导致非常复杂的解决方案(嗯,至少我尝试过的事情,也许我当时做错了)。

我会实现Observer Pattern在 Delphi 中使用接口(interface),您可以使用 thisthis作为开始。

关于delphi - 服务器代码在单个 Delphi 应用程序中通知多个客户端数据更改的首选方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9462691/

相关文章:

git - Delphi包在子包中与自身冲突

delphi - 继续支持不同版本的软件,每个版本都使用不同的 Delphi 或组件版本构建

德尔福 IdHTTPServer (Indy 10.6) : retrive some request/response info from TIdTCPConnection in OnWorkEnd event

安装 Update2 后 Delphi FireMonkey KeyboardType 错误

azure - Toast 通知的通知中心缓存

delphi - TIdHTTP.Get EIdIOHandlerPropInvalid 错误

Azure 通知中心 GCM 身份验证错误 401

javascript - 如何使用 http 向特定用户发送 Chrome 通知

c++ - Poco Poco::NotificationQueue 未按预期工作

android - 后台收到通知时在谷歌地图中添加标记