2013-09-28 3 views
0

현재 OmniThreadLibrary를 실험 중입니다. 내 코드는 다음과 같습니다.OmniThreadLibrary를 사용하는 올바른 방법

procedure TMainForm.LongWait; 
begin 
    Task := Parallel.Future<string>(
    function: string 
    begin 
     Sleep(10000); 
     Result := 'Done'; 
    end, 

    Parallel.TaskConfig.OnTerminated(
    procedure 
    begin 
     if Task.IsDone then 
     MessageDlg('Complete', mtInformation, [mbOK], 0) 
     else 
     MessageDlg('Exception', mtError, [mbCancel], 0) 
    end) 
); 
end; 

저는 LongWait()을 호출하고 UI를 차단하지 않고 정상적으로 작동합니다. 내가 뭘하고 싶은 것은 : 예외가 발생하면 값

  • 기다리는 동안

    • 백그라운드에서 작업 실행을하자, 나는 주 스레드는
    • 주 스레드를 허용 잡으려면 작업이 완료되었거나 취소되었는지 확인하려면

    이 모든 작업을 수행 할 수있는 비 차단 기능이 가능합니까?

    V., 사전에 감사

    편집 : 질문

  • 답변

    5

    let the task run in the background while waiting for the value를 추가

    당신은 몇 가지 다른 방법으로 결과를 기다릴 수

    :

    • Task.Value을 호출하면 값이 계산 될 때까지 차단됩니다.
    • 주기적으로 Task.IsDone으로 전화 한 다음 IsDoneTrue 인 경우 Task.Value으로 전화하십시오.
    • 주기적으로 Task.TryValue으로 전화하십시오.
    • 종료 (OnTerminated) 처리기의 값을 가져옵니다.

    if an exception is raised, I want the main thread to catch it

    예외가 자동으로 코드가 미래의 결과를 읽는 지점으로 전달됩니다. 결과를 어디에서나 읽지 않으므로 을 OnTerminated 처리기에서 간단히 사용할 수 있습니다. (BTW, IsDone 항상 종료 핸들러에서 true가됩니다.)

    allow the main thread to determine if the task was completed or cancelled

    사용 Task.IsCancelled.

    Parallel Programming with the OmniThreadLibrary 도서의 Future chapter에 문서화 된 모든 것.

    +0

    귀하의 블로그는 매우 좋습니다. 이것을 차단하지 않고 값을 기다리는 올바른 방법입니까? 'LongWait; Task.TryValue (100, Value) do do not begin 수면 (500); Application.ProcessMessages; 끝; ' –

    +0

    이것은 하나의 방법입니다. – gabr

    관련 문제