我读了这篇关于创建线程池的文章: http://delphi.about.com/od/kbthread/a/delphi-thread-pool-example-using-asynccalls.htm
我使用作者版本的原因是因为他所做的waitAll函数。这是正常的,除了调用waitAll阻止GUI从而失去使用线程的想法。什么需要改变的提示/提示?我通过电子邮件发送了作者,但他没有回复。
我想过添加Application.ProcessMessages;在等待循环中,但我认为这不是一个好主意。感谢
答案 0 :(得分:6)
等待在GUI线程中完成所有任务是错误的方法。不要这样做。
而是安排每个任务向主线程发出完成信号。当主线程接收到最终完成信号时,它可以执行执行所需的任何任务。您可以计算要运行的所有任务。完成的每个任务都会向主线程发出信号,从而减少计数。当它达到零时,它们都已完成
或创建另一个后台线程,其唯一任务是等待所有其他任务。这在后台线程中很好,因为它不会阻止UI。等待完成后,向UI线程发送消息。
答案 1 :(得分:3)
此伪代码
显示了创建任务并等待工作完成的简单模式// create a management task
task.Create(
procedure
var
tasks : TArray<task>;
begin
// synchronized action to the main thread
// before the work begins
TThread.Queue(nil,
procedure
begin
SomeForm.Button.Enabled := False;
end);
// creation of the tasks doing the real work
tasks := ...
// wait until the work is done
WaitForAll( tasks );
// synchronized action to the main thread
// after the work hs finished
TThread.Queue(nil,
procedure
begin
SomeForm.Button.Enabled := True;
end);
end );
这只是davids answer(第二部分)的伪代码翻译。