Pri*_*nah 0 delphi multithreading 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;
Run Code Online (Sandbox Code Playgroud)
我会调用LongWait(),它可以正常工作而不会阻止UI.我想做的是:
有可能做一个非阻塞功能,可以做所有这些吗?
先感谢您,
V.
编辑:添加问题
let the task run in the background while waiting for the value
您可以通过几种不同的方式等待结果:
Task.Value将阻塞直到计算值.Task.IsDone定期打电话,然后Task.Value在IsDone退货时打电话True.Task.TryValue定期打电话.OnTerminated)处理程序中的值.if an exception is raised, I want the main thread to catch it
异常将自动转发到您的代码读取未来结果的位置.由于您没有在任何地方阅读结果,因此您只需if assigned(Task.FatalException)在OnTerminated处理程序中使用即可.(顺便说一句,IsDone在终止处理程序中总是如此.)
allow the main thread to determine if the task was completed or cancelled
使用Task.IsCancelled.
所有这些都记录在OmniThreadLibrary书籍的并行编程的未来章节中.
| 归档时间: |
|
| 查看次数: |
967 次 |
| 最近记录: |