相关疑难解决方法(0)

进程间通信

我有两个应用程序: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不能导致延迟或其他问题...

delphi winapi ipc delphi-2007

14
推荐指数
3
解决办法
9492
查看次数

寻找进程间通信中使用的Windows消息的替代方法

我有一个多线程应用程序(MIDAS),它使用windows消息与自己进行通信.

主表格

主窗体接收RDM LogData发送的Windows消息('DataToLog')

由于使用了Windows消息,因此它们具有以下属性

  1. 收到的消息是不可分割的
  2. 收到的邮件按照发送顺序排队

题:

你能否在不使用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)

delphi winapi window-messages windows-vista

10
推荐指数
1
解决办法
6682
查看次数