2

私のアプリには、さまざまなアクションのためのいくつかのタスクがあります。
すべてのタスクはFormCreateで作成され、FormDestroyで終了します。アプリが実行されている限り、タスクは常に実行されます。
メインスレッドの唯一の目的は、ユーザーI / Oを処理し、ユーザー入力を適切なタスクに送信するか、メインフォームに表示されるタスク情報を受信することです。

タスク間で転送する必要のあるデータがあります。
例:
データ処理を行うタスクAがあります。
結果の一部をメインスレッドに送信して表示します。
また、いくつかの(他の)データをタスクBに送信する必要があります。タスクBは、データを別のPCに転送します。
タスクCは、ハードウェアデバイスからデータを受信し、このデータをタスクAに送信して処理する必要があります。
等...

これまで理解してきたように、OmniThreadLibraryを使用したメッセージの送信は、常にタスクとタスクを作成したスレッド(メインスレッドとタスクA、またはメインスレッドとタスクB)の間で行われます。

2つのタスク間で直接メッセージを送信するにはどうすればよいですか?

それとも、これまでの私のアプローチに問題があり、それは完全に異なる方法で行う必要がありますか?

4

1 に答える 1

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;
于 2011-01-13T15:20:41.623 に答える