2014-07-22 4 views
-1

TOmniEventMonitor없이 작업을 어떻게 실행할 수 있습니까? 그것없이 시작하면 주 스레드가 멈 춥니 다. OmniThreadLibraryTThread을 기반으로하기 때문에 어떤 의미가 없습니다. UnObserved은 같은 것을 내부 복사본으로 만들기 때문에 실제로이 문제를 해결하지 못합니다.TOmniEventMonitor없이 실행

type 
    TWorker = class(TOmniWorker) 
    function Initialize: Boolean; override; 
    constructor Create; 
    end; 

begin 
var 
    Task: IOmniTaskControl; 
begin 
    Task := CreateTask(TWorker.Create()).Run; // blocks main thread 
    Task := CreateTask(TWorker.Create()).UnObserved.Run; // will create internal monitor each time 
    Task := CreateTask(TWorker.Create()).OnTerminated().Run; // will create internal monitor each time 
end. 

내가 TThread을 작성하는 경우는 "모니터"어떤 종류를 필요로하지 않으며, 어느 주 스레드를 차단하지 않습니다. 나는 어떤 종류의 메시지도 보내지 않고 있는데 왜 "모니터"가 필요한가?

+0

일부 코드는 여기에 도움이 될 것입니다 ... –

+0

질문을 올바르게 이해하고 있다면 모니터가 필요하지 않습니다. IOmniTask를 반환하는 변수에 CreateTask의 결과를 저장하지 않으면 모니터 만 필요합니다 ... Delphi가 열려 있지 않아 메모리에서 입력하고 있습니다. – Graymatter

+2

다음을 읽어보십시오 : http://www.thedelphigeek.com/2009/11/omnithreadlibrary-patterns-task.html – gabr

답변

2

당신은 한 줄에 쓸 수

잘못된 접근 방법의 간단한 예로서 OmniThreadLibrary와 책 병렬 프로그래밍에 정확하게 일이 언급 한 제 4.4 장을 다하고 있습니다 :

CreateTask(MyWorker).Run;

솔루션으로 Proc의 런타임을 다루는 범위를 가진 변수에 CreateTask의 결과를 할당 할 수 있습니다 ess.

다른 해결 방법은 모니터를 사용하는 것입니다.