我创建了一个类:
然后我在我的
一旦启动线程,我只需要取消该进程(
要检查线程是否仍在活动状态,我执行以下操作:
TWorkerThread = class(TThread)
,在TWorkerThread
构造函数中,我设置了FreeOnTerminate := True
。然后我在我的
TForm
中添加了一个私有的Worker
变量。当我为Worker
实例化TWorkerThread
时,我总是使用CreateSuspended := False
。一旦启动线程,我只需要取消该进程(
Terminate
)并检查进程是否完成(该检查基于用户事件)。要检查线程是否仍在活动状态,我执行以下操作:
if (Self.Worker <> nil) and (not Self.Worker.Finished) then
//Still active
这似乎运行良好,但我担心在某个时刻 TWorkerThread
会变成 <> nil
但仍然是 .free
(请记住,TWorkerThread
都是 FreeOnTerminate := True
)。当一个 TWorkerThread
"自我销毁" 后,它们总是变成 nil
吗?如果不是,我该如何处理(以避免访问冲突)?
另外,如果一个 Worker
在其所属的表单销毁时处于活动状态,我会执行以下操作:
if (Self.Worker <> nil) and (not Self.Worker.Finished) then
begin
Self.Worker.Terminate;
//wait here for completion
end;
如果在Terminate
之后进行WaitFor
会导致访问冲突(因为自我销毁)。 我应该在这里强制等待吗? 最好的方法是什么?
这是我在Delphi中第一次正式使用TThread。 上面的代码是我为了清晰起见精简版。
OnTerminate
来通知" 请注意,然而,线程可能会重写TThread.DoTerminate()
以触发OnTerminate
而不使用TThread.Synchronize()
(我有一些线程就是这样做的),从而重新引入您所说的如果使用OnTerminate
就不会发生的线程引用竞争条件。但这是更高级的用法,大多数人不太可能经常这样做,在这种情况下,您所说的方法将正常工作。 - Remy LebeauTThread.DoTerminate()
来调用OnTerminate
而不使用TThread.Synchronize()
。考虑到TThread.OnTerminate
明确记录为在主线程上下文中执行,我们现在谈论的不再是TThread
,而是TYourThread
。但由于它打破了TThread引入的“契约”,所以我会引入一个新的事件来代替它。 - Ken Bourassa