【发布时间】:2011-05-04 13:52:45
【问题描述】:
我有两个应用程序:X 和 Y。
X 是主应用程序,它处理大量 XML 文件。它已经有 10 多年的历史,已经使用了六种技术来存储、处理和处理这些 XML 文件。
Y 是我正在开发的一个调试工具,它可以处理和显示 XML 文件。人类可读的形式。基本上,它只有一组样式表,可以检测 XML 格式,如果它识别格式,它会将 XML 转换为 HTML,然后显示在 TWebBrowser 组件中。
问题:
当 Y 处于活动状态时,我希望 X 将其处理的任何 XML 发送到 Y 以进行显示。但只有在 Y 运行时!如果 Y 没有运行,X 就不会做任何事情。
Y 的检测需要随时进行,并且需要快速。我考虑过使用 TCP/IP 通信,但是缺少 Y 导致的延迟太长了。特别是因为有时会处理大量 XML。命名管道和类似的基于网络的解决方案也存在同样的问题。我需要快速确定 Y 是否正在运行且可用,如果是,则快速发送 XML,然后继续 X。
我还考虑过让 Y 成为基于 COM 的应用程序,或者添加基于 COM 的 DLL 和事件这将允许进程间通信。 DLL 解决方案会很有趣,因为它会向 X 公开一个上传 XML 文件的方法,然后向 Y 发送一个事件来处理 XML。 这似乎是最好的选择,尽管我还需要检查 DLL 是否已注册。如果没有,那么 X 甚至不能调用它!
应用程序 X 也将被没有收到 Y 或额外 DLL 的客户使用,因此在大多数情况下,DLL 不会被注册。 (正如我所说,它旨在帮助调试...)
但也许还有其他选择? TCP/IP 太慢,COM 有点太复杂。
X和Y会在同一个系统上运行。或者只有 X 在系统上,而 Y 完全丢失。
关于使用内存映射文件...虽然实用,但我需要记住,大多数时候,Y 不会运行,因此 MMF 会浪费内存。 XML 数据在 X 中的大小可以达到 4 MB,因此在内存中拥有多个这种大小的块有点过大了。它可用于在 X 和 Y 之间发送状态消息,但内存有时对应用程序 X 来说有点问题。虽然 MMF 可以连接到物理文件,但我试图完全避免写入任何临时文件。这是一个很好的解决方案,但我担心不够好。
我认为一些额外的解释是有序的。应用程序 X 是一个将使用几个小时的应用程序,用户会执行大量操作,这些操作会转换成大量的 XML 数据进行处理。应用程序 X 是一个桌面应用程序,它与多个 Web 应用程序 (REST)、Web 服务 (SOAP) 和其他应用程序进行通信,其中大部分是通过 XML。
应用程序 Y 只是为了窥探 X 正在运行的进程内部。基本上,X 工作 20 分钟,然后 Y 弹出。从那一刻起,X 应该开始向 Y 发送 XML,直到 Y 再次消失或 X 终止。在大多数情况下,Y 只会运行以捕获一小部分正在运行的任务,甚至可能多次启动。但我可能正在以错误的方向思考整个事情。也许 X 应该是一个 Y 注册到它的服务器...当 Y 找不到 X 时这不是一个真正的问题。但是 X 找不到 Y 不会导致延迟或其他问题...
【问题讨论】:
标签: delphi winapi ipc delphi-2007