相关疑难解决方法(0)

确保在线程自毁之前完成所有TThread.Queue方法

我发现如果一个排队的方法TThread.Queue调用一个调用TApplication.WndProc(例如ShowMessage)的方法,那么允许后续的排队方法在原始方法完成之前运行.更糟糕的是,它们似乎没有按FIFO顺序调用.

[编辑:实际上他们确实以FIFO顺序开始.有了ShowMessage它看起来像一个后来跑了第一,因为有一个呼叫CheckSynchronize出现的对话框中之前.这会使下一个方法出错并运行它,直到后一个方法完成才返回.只有这样才会出现对话框.]

我正在尝试确保从工作线程排队的所有方法在VCL线程中运行以严格的FIFO顺序运行,并且它们都在工作线程被销毁之前完成.

我的另一个限制是我试图保持GUI与业务逻辑的严格分离.在这种情况下,线程是业务逻辑层的一部分,所以我不能使用PostMessage从一个OnTerminate处理程序的线程被破坏(如在别处推荐由多个贡献者)安排.所以我FreeOnTerminate := True在TThread.Execute退出之前设置了最终的排队方法.(因此需要它们以严格的FIFO顺序执行.)

这是我的TThread.Execute方法结束的方式:

finally
  // Queue a final method to execute in the main thread that will set an event
  // allowing this thread to exit. This ensures that this thread can't exit
  // until all of the queued procedures have run.
  Queue(
    procedure
    begin
      if Assigned(fOnComplete) then
      begin
        fOnComplete(Self);
        // Handler sets fWorker.FreeOnTerminate := True and fWorker := nil …
Run Code Online (Sandbox Code Playgroud)

delphi multithreading

8
推荐指数
3
解决办法
2590
查看次数

标签 统计

delphi ×1

multithreading ×1