2011-01-13 105 views
2

我的应用程序将有几个任务的各种行动。
所有任务都在FormCreate中创建并在FormDestroy中终止,只要应用程序正在运行,它们就会始终运行。
主线程的唯一目的是处理用户I/O并将用户输入发送到适当的任务或接收任务信息以显示在主窗体中。是否可以在任务(OmniThreadLibrary)之间发送消息?

会有数据必须在任务之间传输。
例如:
我将有任务A在做数据处理。
它会将一些结果发送到主线程进行显示。
它还必须发送一些(其他)数据到任务B,它将数据传输到另一台PC。
任务C将从硬件设备接收一些数据,并且必须将此数据发送给任务A进行处理。
etc ...

据我所知,使用OmniThreadLibrary发送消息总是在任务和创建任务的线程(主线程和任务A或主线程和任务B)之间。

如何在任何两个任务之间直接发送消息?

或者到目前为止我的方法有什么问题,它应该完全不同?

回答

6

可能的。您必须在所有者中创建通信信道并将其传递给两个任务。然后在任务中调用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; 
相关问题