考虑以下程序:
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/