Multithreading 未来使用OmniThreadLibrary的正确方法
我目前正在试用OmniThreadLibrary。随函附上我的代码:Multithreading 未来使用OmniThreadLibrary的正确方法,multithreading,delphi,omnithreadlibrary,Multithreading,Delphi,Omnithreadlibrary,我目前正在试用OmniThreadLibrary。随函附上我的代码: procedure TMainForm.LongWait; begin Task := Parallel.Future<string>( function: string begin Sleep(10000); Result := 'Done'; end, Parallel.TaskConfig.OnTerminated( procedure
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;
程序TMainForm.LongWait;
开始
任务:=并行。未来(
函数:字符串
开始
睡眠(10000);
结果:=‘完成’;
完,,
Parallel.TaskConfig.OnTerminated(
程序
开始
如果Task.IsDone那么
MessageDlg('Complete',mtInformation,[mbOK],0)
其他的
MessageDlg('Exception',mtError,[mbCancel],0)
(完)
);
结束;
我会调用LongWait(),它可以在不阻塞UI的情况下正常工作。我想做的是:
- 让任务在后台运行,同时等待值
- 如果引发异常,我希望主线程捕获它
- 允许主线程确定任务是否已完成或取消
编辑:添加问题
让任务在后台运行,同时等待值
您可以通过几种不同的方式等待结果:
- 调用
,直到计算出值为止Task.Value
- 定期调用
,然后在Task.IsDone
返回IsDone
时调用True
Task.Value
- 定期调用
Task.TryValue
- 获取终止(
)处理程序中的值OnTerminated
如果引发异常,我希望主线程捕获它
异常将自动转发到代码读取未来结果的点。由于您没有在任何地方读取结果,您只需在OnTerminated
处理程序中使用if assigned(Task.FatalException)
。(顺便说一句,IsDone
在终止处理程序中始终为true。)
允许主线程确定任务是否已完成或取消
使用Task.IsCancelled
所有这些都记录在本书的中。
让任务在后台运行,同时等待值
您可以通过几种不同的方式等待结果:
- 调用
,直到计算出值为止Task.Value
- 定期调用
,然后在Task.IsDone
返回IsDone
时调用True
Task.Value
- 定期调用
Task.TryValue
- 获取终止(
)处理程序中的值OnTerminated
如果引发异常,我希望主线程捕获它
异常将自动转发到代码读取未来结果的点。由于您没有在任何地方读取结果,您只需在OnTerminated
处理程序中使用if assigned(Task.FatalException)
。(顺便说一句,IsDone
在终止处理程序中始终为true。)
允许主线程确定任务是否已完成或取消
使用Task.IsCancelled
所有这些都记录在书的结尾。你的博客非常棒。这是在不阻塞的情况下等待值的正确方法吗?”朗威特;而不是任务。TryValue(100,Value)确实开始睡眠(500);Application.ProcessMessages;结束;'这是一种方式。你的博客很好。这是在不阻塞的情况下等待值的正确方法吗?”朗威特;而不是任务。TryValue(100,Value)确实开始睡眠(500);Application.ProcessMessages;结束;'这是一种方法。