【问题标题】:Sharing a common memory area in Delphi between PCs在 PC 之间共享 Delphi 中的公共内存区域
【发布时间】:2010-10-01 14:42:44
【问题描述】:

我有一个 Delphi 2006 应用程序,它收集数据并将其显示为许多通道的摘要,在 TDrawGrid 上每行一个通道。我在网络上的各种其他 PC 上运行相同的应用程序,但这些其他 PC 是从属的 - 它们不收集数据,而只是提供摘要的远程显示。

目前,slave 只是在 master 上显示一个摘要显示屏幕的模拟,这是通过来自 master 的邮槽的广播来实现的。

我想以不同的方式实现这一点,以减少主机的负载,并为从机在解释数据的方式上提供更多的灵活性和独立性。此外,我在跨子网的邮件槽广播数据方面遇到问题。

我可以使用一些共享内存方案将数据放到内存映射文件中,从属可以从任何地方(甚至通过网络)访问该文件?我们谈论的是最大 100k 字节的内存大小,例如,由 master 以大约每秒一次的速度更新,可能在一个线程中,以保持 master 前台任务的响应。

【问题讨论】:

    标签: delphi shared-memory delphi-2006 mailslot


    【解决方案1】:

    共享内存无法通过网络运行(除非您运行 VPN),并且通常无法通过网络正常运行(视图可以取消同步,并且您无法通过网络同步它们)。

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

    选项 1. 使用面向消息的中间件 (MOM),例如 MSMQ、kbmMW、我们的 MsgConnect 来广播仅包含数据更改的通知。这样客户端就不需要额外轮询服务器以获取数据快照。所有 MOM 解决方案都使用 TCP 连接进行操作,这比邮槽更可靠。

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 标准的windows文件访问机制不会防止脏读吗?有时,从站将无法获取数据,但这不是真正的问题。脏读无关紧要,因为无论如何它们都会在下一次主节点轮询时被替换。据推测,master 上的读写磁盘缓存意味着对文件的大多数访问将是对内存的读取或写入?
      • @user89691:这取决于文件的打开方式以及是否使用了任何锁定机制。最简单的方法是master打开文件write/allow read,slave只读/allow read/write。但这将允许脏读。其他打开标志可以防止脏读,但双方必须处理拒绝访问错误。
      • 脏读到底是什么?你是说如果master正在更新文件“write/allow read”并且slave读取它,slave可能会得到一半的旧数据和一半的新数据?我认为操作系统至少将记录写入保持为原子。如果没有,是否有足够的锁定机制以“写入/拒绝读取”的方式打开文件,更新数据,关闭文件(并使从站应对它无法获取数据的时间)?
      • @user89691:是的,“脏读”意味着当主服务器写入文件时,从服务器读取它并获取部分旧的和部分新的数据。操作系统不保持记录写入原子,因为它不知道记录。我想如果一次性写入(可能是 4k 块),它会保持一定大小的原子写入,但我不确定。是的,打开“写/拒绝读”和关闭将是一种锁定机制,但前提是从属使用打开“读/拒绝写”,然后主控也必须应对打开失败。否则(Open read/deny none)会再次导致潜在的脏读。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        使用 TCP/IP 有什么问题?您可以使用Indy(已与 Delphi 一起提供)或ICS 让您的主(主)应用程序使用一两个线程响应 IP 请求(例如,HTTP 或 ICMP 或任何适合您的数据需求),并且让“从属”应用程序只需通过特定端口上主控设备的 IP 地址请求数据。这可以在 Intranet 上或通过 Internet 透明地工作。

        【讨论】:

          【解决方案5】:

          我们将 MSMQ 用于类似的事情。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-07-04
            • 1970-01-01
            • 2014-04-25
            • 2012-03-22
            • 1970-01-01
            相关资源
            最近更新 更多