我的应用程序将执行多项任务以执行各种操作。
所有任务都在FormCreate中创建,并在FormDestroy中终止,只要应用程序正在运行,它们便始终在运行。
主线程的唯一目的是处理用户I / O并将用户输入发送到适当的任务或接收要在主表单中显示的任务信息。
任务之间必须传输数据。
例:
我将让任务A进行数据处理。
它将一些结果发送到主线程进行显示。
它还必须将一些(其他)数据发送到任务B,任务B将把数据传输到另一台PC。
任务C将从硬件设备接收一些数据,并且必须将此数据发送到任务A进行处理。
等等...
到目前为止,据我了解,使用OmniThreadLibrary发送消息始终位于任务和创建任务的线程之间(主线程和任务A,或主线程和任务B)。
如何在任何两个任务之间直接发送消息?
或者到目前为止,我的方法是否存在任何问题,应该完全不同地进行?
最佳答案
可能。您必须在所有者中创建一个沟通渠道,并将其传递给两个任务。然后,在任务中调用Task.RegisterComm来注册此通信通道。从那时起,将使用标准的OmniThreadLibrary机制分派在此通道上收到的所有消息(即,就像从所有者发送一样)。
有关示例,请参见演示08_RegisterComm。
procedure TfrmTestRegisterComm.FormCreate(Sender: TObject);
begin
FCommChannel := CreateTwoWayChannel(1024);
FClient1 := CreateTask(TCommTester.Create(FCommChannel.Endpoint1))
.Run;
FClient2 := CreateTask(TCommTester.Create(FCommChannel.Endpoint2))
.Run;
end;
function TCommTester.Initialize: boolean;
begin
Task.RegisterComm(ctComm);
Result := true;
end;