gpt4 book ai didi

delphi - 使用 IOmniTaskControl/TOmniWorker 时等待 Invoke 完成

转载 作者:行者123 更新时间:2023-12-03 15:49:48 27 4
gpt4 key购买 nike

我使用 TOmniWorker 创建了一个 IOmniTaskControl,以便我可以定期在特定线程上运行代码块。因此,我将根据需要在此 IOmniTaskControl 上调用 Invoke。当我这样做时,有时需要等待与该工作相关的执行完成。

我尝试在 Invoke 之后在 IOmniTaskControl 上调用 WaitFor(INFINITE),但它挂起。我进行了调试,可以看到 Invoke 调用的方法已完成。当与 TOmniWorker 一起使用时,我是否误解了 WaitFor 与 IOmniTaskControl 的使用?

编辑:我编辑了测试文件夹中的 test_43_InvokeAnonymous 项目,我看到了相同的行为:

procedure TfrmInvokeAnonymousDemo.btnInvokeClick(Sender: TObject);
var
formThreadID: DWORD;
task : IOmniTaskControl;
begin
formThreadID := GetCurrentThreadID;
if Sender = btnInvoke then
task := FTask
else
task := FMonitoredTask;

task.Invoke(
procedure (const task: IOmniTask)
var
taskThreadID: DWORD;
begin
// this will execute in the context of the worker thread
taskThreadID := GetCurrentThreadID;
Sleep(2000);
// task.Invoke(
// procedure
// begin
// // this will execute in the context of the main thread
// frmInvokeAnonymousDemo.lbLog.Items.Add(Format(
// 'Current thread ID: %d, task thread ID: %d, ' +
// ' form thread ID: %d',
// [GetCurrentThreadID, taskThreadID, formThreadID]));
// end
// );
end
);

task.WaitFor(INFINITE);
frmInvokeAnonymousDemo.lbLog.Items.Add('Done waiting.');
end;

使用上面的代码,task.WaitFor(INFINITE); 挂起。

最佳答案

WaitFor 等待任务完成执行,但由于没有人告诉任务终止,它将永远等待。

安排后台操作然后等待它或多或少违背了后台执行的目的。最好安排一个后台任务,然后在任务完成时向主线程发送通知。使用 OnMessage 的任何变体(在主线程中)和 Task.Comm.Send (在 worker 中)。

更好的方法是使用 Parallel.Future ,它准确地封装了您想要执行的操作。

如果您确实必须等待 Invoke 完成,您可以创建 waitable valueInvoke 之前,在 Invoke 执行的代码中向其发出信号,并在调用 Invoke 的代码中等待它。

关于delphi - 使用 IOmniTaskControl/TOmniWorker 时等待 Invoke 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36047891/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com