假设我有一个匿名线程进行一些后台处理:
procedure TForm1.FormCreate(Sender: TObject);
begin
TThread.CreateAnonymousThread(procedure begin
while True do begin
Sleep(500);
OutputDebugString('I am alive');
end;
end).Start;
end;
线程不与主线程共享任何资源,它只是坐在那里并“永远”运行。
由于没有像Terminate
for anonymous threads这样的内置机制,这是否意味着我不必在进程的主线程退出时通知线程?
如果您只是启动一个新的VCL应用程序,请在FormCreate事件中粘贴上面的代码,它将每隔半秒向调试消息写入I am alive
。当应用程序退出时(即通过关闭表单),似乎该线程也被退出,尽管它没有检查任何信号。
没关系,还是我必须使用TEvent
或类似的方法来实现一些信号以通知线程?
或者编写自定义TThread
后代并在以后保留对Thread.Free
线程的引用是否更好?
答案 0 :(得分:7)
您需要终止您创建的任何线程,甚至是匿名线程,例如:
procedure TForm1.FormCreate(Sender: TObject);
begin
TThread.CreateAnonymousThread(procedure begin
while not Application.Terminated do begin // <--
Sleep(500);
OutputDebugString('I am alive');
end;
end).Start;
end;