2013-09-28 96 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(),它工作正常,沒有阻止用戶界面。我想這樣做的是:

  • 讓任務在後臺運行,同時等待值
  • 如果有異常升高時,我想主線程抓住它
  • 允許主線程以確定任務是否完成或取消

是否有可能做一個非阻塞功能,將做所有這些?

謝謝你在前進,

編輯:添加的問題

回答

5

let the task run in the background while waiting for the value

你可以等待在幾種不同的方式結果:

  • 致電Task.Value,這將阻塞,直到計算值。
  • 定期致電Task.IsDone,然後在IsDone返回True時致電Task.Value。定期致電Task.TryValue
  • 獲取終止值(OnTerminated)處理程序中的值。

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

異常將被自動轉發到您的代碼讀取未來結果的地步。由於您沒有在任何地方讀取結果,因此只需在OnTerminated處理程序中使用if assigned(Task.FatalException)即可。 (順便說一句,IsDone總是會在終止處理程序真的。)

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

使用Task.IsCancelled

Parallel Programming with the OmniThreadLibrary書的Future chapter中記錄的全部內容。

+0

您的博客非常好。這是等待數值沒有阻塞的正確方法嗎? 012W'LongWait; 而不是Task.TryValue(100,Value)do begin Sleep(500); Application.ProcessMessages; 結束; ' –

+0

這是其中一種方式。 – gabr