2011-01-13 5 views
2

내 앱에는 다양한 작업을위한 여러 가지 작업이 있습니다.
모든 작업은 FormCreate에서 만들어지고 FormDestroy에서 종료됩니다. 앱이 실행되는 동안 항상 실행됩니다.
주 스레드의 유일한 목적은 사용자 I/O를 처리하고 사용자 입력을 적절한 작업에 보내거나 주 양식에 표시 할 작업 정보를받는 것입니다.작업 (OmniThreadLibrary)간에 메시지를 보낼 수 있습니까?

작업간에 데이터를 전송해야합니다.
예 :
데이터 처리를 수행하는 작업 A가 있습니다.
결과를 메인 스레드로 전송하여 표시합니다.
또한 다른 (다른) 데이터를 다른 PC로 전송할 작업 B에 보내야합니다.
작업 C는 하드웨어 장치에서 일부 데이터를 수신하고이 데이터를 처리를 위해 작업 A로 보내야합니다.

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; 
관련 문제