2013-09-28 61 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