2011-01-13 12 views
2

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

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

OmniThreadLibraryでメッセージを送信することは、タスクとそのタスクを作成したスレッド(メインスレッドとタスクA、またはメインスレッドとタスクB)の間にメッセージを送信することです。

どのようにして2つのタスク間で直接メッセージを送信できますか?

これまでの私のアプローチには何か問題がありますか?まったく違うのですか?

答えて

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; 
関連する問題