我有两个申请:X和Y。
X是主要的应用程序,它处理大量的XML文件。它已经有了十多年的历史,已经使用了六种技术来存储、处理和处理这些XML文件。
Y是我正在开发的一个调试工具,它可以以一种更具人类可读性的形式处理和显示XML文件。基本上,它只是一个样式表集合,它将检测XML格式,如果它识别该格式,它将将该XML转换为显示在TWebBrowser组件中的HTML。
问题:
当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中的大小可以高达4MB,因此在内存中有多个这样大小的块有点过分。它可以用于在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不会导致延迟或其他问题.
发布于 2010-11-03 16:03:37
你可以做得更简单,因为你只是想知道一个应用程序是否是从另一个应用程序中运行的。只要它们是由同一用户在同一台机器上运行,您就可以让X简单地使用FindWindow查看Y当前是否正在运行。只需确保您给Y一个有意义的名称(在下面的示例中,它是TXMLFormatterForm):
var
XMLWindow: HWnd;
begin
XMLWindow := FindWindow('TXMLFormatterForm', nil);
if XMLWindow > 0 then
// Y is running
end;您也可以使用Y的窗口标题(标题),只要您确信它是不同的:
XMLWindow := FindWindow(nil, 'Workshop Alex's XML Formatter');发布于 2010-11-03 17:52:17
看看我的IPC:
http://www.cromis.net/blog/downloads/cromis-ipc/
它是快速的,免费的,并且有一个可选择的超时,所以您可以将它设置为非常小的数量(例如,50 is )。因为它非常快(典型的消息周期请求-> process ->响应所需时间小于1ms,约为0.1ms),所以可以有非常小的超时时间。它有客户端服务器内置,所以很多客户端都没有问题。它运行线程的任务池后,所以它不冻结您的程序,它有非常灵活的数据包,以方便写入/读取数据。
如前所述,您甚至可以使用其他方法检查调试器是否正在运行。
发布于 2010-11-03 15:37:28
您可以让X将其输出写到一个内存映射文件 -Y可以检索数据,如果它正在运行。这样X就不关心Y是否上升了。
X可以在一个已知的位置写入某种控制信息(例如。将最后1000个写入的XML的偏移量存储在映射文件中的偏移量0处),并将文件的其余部分用作原始数据的循环缓冲区。
如果需要Y作为X中操作的决定因素,请让Y创建映射的文件,然后使用它的存在/缺位来检查“通道”X侧的数据生成。有创建者和第二个用户这里的示例代码。
https://stackoverflow.com/questions/4088776
复制相似问题