Overbyte NamedPipes;在另一个线程上发送消息

时间:2016-12-29 18:24:03

标签: multithreading delphi named-pipes delphi-10-seattle

我是IPC(进程间通信)的新手。做我的研究,我决定使用命名管道 我的应用程序由两部分组成:监控应用程序和UI仪表板。仪表板不断地从监视器接收更新并显示统计信息,用户应该能够通过仪表板更改监视器的某些参数(刷新率,重启过程,计划任务......),因此它必须是双向通信。监视器稍后将成为服务应用程序,但这是以后的计划 说到这一点,我使用了Overbyte(Francois Piette)v1.01的Pipes单元 并按照website上的示例进行操作。连接主线程上的管道时,它正常运行。但由于我的监视器需要一个单独的线程(监视器发送消息 - 睡眠循环...),当我尝试连接另一个线程时,我收到错误"通知窗口和组件窗口不存在于同一个线程中!"

  • 我需要知道的是,命名管道可以使用单独的线程进行通信吗? (根据错误消息判断,我觉得它可能是在主UI上获取窗口句柄而不能在不同的线程上工作)
  • 有没有更好的方法来实现我的应用程序?或命名管道比Overbyte更好?

我的代码示例:

TThreadMonitor = Class(TThread)
  private
    PipeClient1: TPipeClient;
    listOfProcesses: Array of String;
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);

    procedure ConnectPipe;
    procedure SendMessage(const Msg: String);
  End;

var
t: TThreadMonitor;

procedure TClientFormMain.BtnDifferentThreadClick(Sender: TObject);
begin
  t := TThreadMonitor.Create(TRUE);
  t.FreeOnTerminate := TRUE;

  t.Start;
end;

procedure TThreadMonitor.ConnectPipe;
begin
  if not PipeClient1.Connect(2000, TRUE) then
    LogThis('Pipe connection failed', LogFilePath, TRUE)
  else
    LogThis('Pipe connected', LogFilePath, TRUE);
end;

procedure TThreadMonitor.Execute;
begin
  inherited;

  ConnectPipe;  //<---throws exception here although getting "Pipe Connected"
    while not Terminated do
    begin
      for i := 0 to Length(listOfProcesses) - 1 do
      begin
        ...
        MonitorProcess(listOfProcesses[i]);
        ...
      end;
      sleep(2000);
    end;
end;

0 个答案:

没有答案