2010-10-01 72 views
2

我有一个Delphi 2006应用程序,用于收集数据并将其显示为多个通道的摘要,每个通道在TDrawGrid上一个通道。我有同样的应用程序运行在网络上的各种其他PC上,但这些其他PC是从属 - 他们不收集数据,但仅提供远程显示摘要。在PC之间共享Delphi中的公共内存区域

目前,奴隶只显示主人的总结显示屏幕的模仿,这是通过从主人的邮筒广播实施。

我希望以不同的方式实现此目的,以减少主站的负载,并为从站提供更多的灵活性和独立性来解释数据。另外,我在跨子网的数据的邮筒广播方面遇到问题。

我可以使用一些共享内存方案将数据放置到内存映射文件中,从站可以从任何地方访问(通过Web,甚至是)?我们正在讨论最大100k字节的内存大小,比如说,由主人每秒大约更新一次,可能在一个线程中,以保持主前台任务响应。

回答

2

最简单的方法是在主机写入并且从机只读取的共享上使用文件。如果您想防止“脏读”,可能需要某种同步。另一方面,这可能无关紧要,这取决于您要显示的数据类型。

使用简单文件的优点是,它不需要遵循KISS原则的任何附加软件(例如,daetabase服务器或某些中间件)。但它当然远没有性感;-),并没有使用正确的流行语技术。

+0

标准的Windows文件访问机制会不会妨碍脏读?偶尔奴隶将无法获得数据,但这不会是真正的问题。肮脏的阅读无关紧要,因为无论如何它们将在下一次主人轮询中被替换。据推测,在主设备上读取和写入磁盘缓存意味着对文件的大部分访问将是读取或写入内存呢? – rossmcm 2010-10-01 21:09:24

+0

@ user89691:这取决于文件如何打开以及是否使用任何锁定机制。最简单的方法是让主设备打开文件写/允许读取和从设备只读/允许读/写。但是,这将允许脏读。其他打开的标志可以防止脏读,但双方都必须处理访问被拒绝的错误。 – dummzeuch 2010-10-02 09:34:35

+0

究竟是什么脏读?你是说如果主人正在更新文件“写/允许读取”并且从服务器读取它的过程中,从服务器可能获得一半旧数据和一半新数据?我认为操作系统至少把记录写入原子。如果没有,那么一个足够的锁定机制是将文件打开为“写入/拒绝读取”,更新数据,关闭文件(并使从机应对其获取数据的时间)? – rossmcm 2010-10-02 13:30:23

2

您可以使用DBISAM,Firebird等数据库。 使用DBISAM,我使用了读取数据库文件头八个字节的技巧,这似乎是一个头。如果它改变了,我知道表中的数据已经改变了,否则它没有改变。如果您使用轮询循环,或者您想继续将邮筒用作通知方法,则可以在客户端中使用此功能。即每隔10秒或在邮槽通知时轮询文件,以先到者为准。

0

我们使用MSMQ来做类似的事情。

4

共享内存无法通过网络运行(除非您运行VPN),并且它在网络中通常无法正常工作(视图可能会失步并且无法通过网络同步它们)。

我可以看到几个解决方案,你的任务:

选项1.使用面向消息的中间件(MOM),如MSMQ,kbmMW,我们MsgConnect广播通知,其中包括只在您的数据的变化。通过这种方式,客户端不需要额外轮询服务器以获取数据快照。所有MOM解决方案都使用TCP连接进行操作,并且比邮筒更可靠。

选项2.使用一些客户端服务器DBMS,可能是支持通知给客户端的那个(我不是DMBS的专家,所以我不能告诉你名字)。

2

使用TCP/IP有什么问题?您可以使用​​(与Delphi一起发货)或ICS让您的主(主)应用程序使用一两个线程对IP请求(例如,HTTP或ICMP或任何适合您的数据需求的应用程序)作出响应,并使“slave “应用程序只需通过特定端口上的主设备的IP地址来请求数据。这可以在Intranet上或通过互联网透明地工作。

相关问题