当它进入 IPC 时,一些提示:
- 不要拘泥于一种协议:例如,如果您实现了命名管道通信,您以后可能需要通过网络甚至 HTTP 运行它;
- 不要重新发明轮子,也不要使用专有消息,而是使用标准格式(如 XML / JSON / BSON);
- 回调事件有点难以实现,因为常见的模式可能是为每个桌面客户端实现一个服务器,以接收来自服务器的通知。
我的建议是不要使用回调,而是在桌面应用程序上轮询无状态架构。您打开与服务器的通信通道,然后每隔一秒/半秒(TTimer
在您的 UI 中使用 a),您发出一个小请求,询问发生了什么变化(您可以输入修订号或上次检索的时间戳)。因此,您将桌面数据与未决事件同步。在现有连接上请求更新非常快,如果没有任何变化,只会在网络上来回发送一个 IP 数据包。这是一项非常小的任务,不会减慢客户端和服务器的速度(如果您使用一些内存缓存)。
在实际应用中,从最终用户的角度来看,这种无状态架构响应速度非常快,并且更易于部署。您不需要在每个桌面应用程序上创建服务器,因此您不必打开防火墙端口等。由于 HTTP 是无状态的,因此它甚至对 Internet 友好。
如果你想开发服务,你可以使用DataSnap,比如RemObjects或者你可以试试我们的开源 mORmot 框架,它能够创建基于接口的服务,通过 REST 使用轻 JSON 消息,或者在进程中,使用 GDI 消息,命名为管道或 TCP/HTTP - 免费,具有无与伦比的性能,内置安全性,从 Delphi 6 到 XE2。对于基于事件的任务,只需使用mORMot中提供的客户端-服务器 ORM可能就足够了:创建一个存储事件的表/类(您甚至可以定义一个循环的内存存储 - 无需在此处使用 SQLite3 引擎或数据库),然后询问自上次刷新以来的所有未决事件。服务器可以安全地作为后台服务或普通应用程序 - 一些mORMot用户甚至拥有相同的可执行文件,可以作为独立应用程序、服务器服务、应用程序服务器或 UI 客户端,只需更改配置。
编辑/公告:
在mORMot 路线图上,我们添加了一项即将推出的新功能,以轻松实现来自服务器的单向回调。
也就是说,在我们的面向服务架构框架中添加透明的“推送”模式。目的是实现从服务器端触发的通知事件,很容易从 Delphi 代码通过一些interface
定义,甚至通过单个 HTTP 连接 - 例如,WCF 不允许这样做:它需要双重绑定,因此需要打开防火墙端口等。
它将通过发布/订阅模式用于简单的事件协作,并允许事件溯源。我将尝试让它实现两种模式:轮询和锁定等待。直接回答你的问题。