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