考虑以下程序:

program TThreadBug;
{$APPTYPE CONSOLE}

uses
  SysUtils, Classes, Windows;

type
  TMyThread = class(TThread)
  protected
    procedure Execute; override;
  end;

procedure TMyThread.Execute;
var
  i: Integer;
begin
  for i := 1 to 5 do begin
    Writeln(i);
    Sleep(100);
  end;
end;

procedure UseTThread;
var
  Thread: TMyThread;
begin
  Writeln('TThread');
  Thread := TMyThread.Create;
  Thread.Terminate;
  Thread.WaitFor;
  Thread.Free;
  Writeln('Finished');
  Writeln;
end;

procedure UseTThreadWithSleep;
var
  Thread: TMyThread;
begin
  Writeln('TThreadWithSleep');
  Thread := TMyThread.Create;
  Sleep(100);
  Thread.Terminate;
  Thread.WaitFor;
  Thread.Free;
  Writeln('Finished');
  Writeln;
end;

begin
  UseTThread;
  UseTThreadWithSleep;
  Readln;
end.

输出为:

线程
完成的

TThreadWithSleep
1个
2个
3
4
5
完成的

因此,出于某种原因,看来主线程必须终止或等待工作线程之前要等待任意时间。我是否认为这是TThread中的错误?有什么办法可以解决这个问题?我希望,如果让线程发出信号已开始(使用事件)的信号,则可以解决该问题。但是,这让我感到肮脏。

最佳答案

您可以将其称为错误或TThread设计缺陷,该问题已被讨论了很多次。参见例如http://sergworks.wordpress.com/2011/06/25/sleep-sort-and-tthread-corner-case/

问题是,如果设置了TThread.Terminated标志,则永远不会调用TThread.Execute方法。因此,就您而言,不要在TThread.Terminate之前调用TThread.WaitFor

关于delphi - 如何可靠地等待刚刚创建的线程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15042038/

10-10 09:53