如果主线程完成,我是否必须向匿名线程发出退出信号?
Do I have to signal an anonymous thread to exit if the main thread is done?
假设我有一个做一些后台处理的匿名线程:
procedure TForm1.FormCreate(Sender: TObject);
begin
TThread.CreateAnonymousThread(procedure begin
while True do begin
Sleep(500);
OutputDebugString('I am alive');
end;
end).Start;
end;
该线程不与主线程共享任何资源,它只是坐在那里运行 "forever"。
既然没有Terminate
for anonymous threads这样的内置机制,那是不是说我在进程主线程退出的时候就不用通知线程了?
如果您刚刚启动一个新的 VCL 应用程序并将上面的代码粘贴到 FormCreate 事件中,它将每半秒向调试消息写入 I am alive
。当应用程序退出时(即通过关闭表单),似乎线程也退出了,尽管它不检查任何信号。
这样可以吗,还是我必须使用 TEvent
或类似的方式实现一些信号来通知线程?
还是编写自定义 TThread
后代并保留对线程的引用以供稍后 Thread.Free
更好?
您需要终止您创建的任何线程,即使是匿名线程,例如:
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;
假设我有一个做一些后台处理的匿名线程:
procedure TForm1.FormCreate(Sender: TObject);
begin
TThread.CreateAnonymousThread(procedure begin
while True do begin
Sleep(500);
OutputDebugString('I am alive');
end;
end).Start;
end;
该线程不与主线程共享任何资源,它只是坐在那里运行 "forever"。
既然没有Terminate
for anonymous threads这样的内置机制,那是不是说我在进程主线程退出的时候就不用通知线程了?
如果您刚刚启动一个新的 VCL 应用程序并将上面的代码粘贴到 FormCreate 事件中,它将每半秒向调试消息写入 I am alive
。当应用程序退出时(即通过关闭表单),似乎线程也退出了,尽管它不检查任何信号。
这样可以吗,还是我必须使用 TEvent
或类似的方式实现一些信号来通知线程?
还是编写自定义 TThread
后代并保留对线程的引用以供稍后 Thread.Free
更好?
您需要终止您创建的任何线程,即使是匿名线程,例如:
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;