Delphi:等待线程完成

时间:2015-10-26 12:07:36

标签: multithreading delphi threadpool

我读了这篇关于创建线程池的文章: http://delphi.about.com/od/kbthread/a/delphi-thread-pool-example-using-asynccalls.htm

我使用作者版本的原因是因为他所做的waitAll函数。这是正常的,除了调用waitAll阻止GUI从而失去使用线程的想法。什么需要改变的提示/提示?我通过电子邮件发送了作者,但他没有回复。

我想过添加Application.ProcessMessages;在等待循环中,但我认为这不是一个好主意。感谢

2 个答案:

答案 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(第二部分)的伪代码翻译。