我有两个应用程序: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会浪费内存.X中的XML数据最大可达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不能导致延迟或其他问题...
我有一个多线程应用程序(MIDAS),它使用windows消息与自己进行通信.
主表格
主窗体接收RDM LogData发送的Windows消息('DataToLog')
由于使用了Windows消息,因此它们具有以下属性
题:
你能否在不使用Windows消息的情况下建议更好的方法?
主要代码
const
UM_LOGDATA = WM_USER+1002;
type
TLogData = Record
Msg : TMsgNum;
Src : Integer;
Data : String;
end;
PLogData = ^TLogData;
TfrmMain = class(TForm)
//
private
procedure LogData(var Message: TMessage); message UM_LOGDATA;
public
//
end;
procedure TfrmMain.LogData(var Message: TMessage);
var LData : PLogData;
begin
LData := PLogData(Message.LParam);
SaveData(LData.Msg,LData.Src,LData.Data);
Dispose(LData);
end;
Run Code Online (Sandbox Code Playgroud)
RDM代码
procedure TPostBoxRdm.LogData(DataToLog : String);
var
WMsg : TMessage;
LData : PLogData;
Msg : TMsgNum;
begin
Msg := MSG_POSTBOX_RDM;
WMsg.LParamLo …Run Code Online (Sandbox Code Playgroud)