我得到的印象是一个至少有一点可控性的线程在主线程上必须完全不使用
因此,也应该避免使用 onTerminate 事件,因为它将使用 Synchronize 被调用。
例如,我有一个执行某些繁重后台工作的线程。我想在状态栏中观察其进度,并在用户按下关闭按钮时能够“优雅地”停止它。
我不能使用
因此,线程的销毁是主线程的责任。在某种完成工作的 DoTerminate 过程中执行所有“完成”工作并将 onTerminate 事件指向它将是合理的。但是这容易造成死锁:我们无法从 DoTerminate 中释放线程,因为 TThread.Free 中有 WaitFor ,它不能在同步 onTerminate 事件完成之前完成。
不仅如此,如果工作线程在其中有任何 Synchronize 调用(例如,它想通知我们已经完成了一些工作百分比等),则在这个非常时刻如果主线程正在进行某些操作,它们会相互阻塞!
因此,在我看来,使用 Synchronize 的唯一方式是将所有调用委托给工作线程端!例如,我们将其设置为
我是否遗漏了什么(一些内部机制可以以某种方式克服这些死锁)?因为我有点惊讶:Synchronize() 是 Delphi 多线程手册中描述的第一个方法之一。它真的那么无用吗?
Synchronize()
:任何尝试这样做几乎立即导致死锁在一个情况或另一个情况下。因此,也应该避免使用 onTerminate 事件,因为它将使用 Synchronize 被调用。
例如,我有一个执行某些繁重后台工作的线程。我想在状态栏中观察其进度,并在用户按下关闭按钮时能够“优雅地”停止它。
我不能使用
FreeOnTerminate := true
,因为一旦线程启动,我就不能调用其任何方法:在任何时刻,它可能会被销毁,并且我会获取访问冲突(或完全损坏)。因此,线程的销毁是主线程的责任。在某种完成工作的 DoTerminate 过程中执行所有“完成”工作并将 onTerminate 事件指向它将是合理的。但是这容易造成死锁:我们无法从 DoTerminate 中释放线程,因为 TThread.Free 中有 WaitFor ,它不能在同步 onTerminate 事件完成之前完成。
不仅如此,如果工作线程在其中有任何 Synchronize 调用(例如,它想通知我们已经完成了一些工作百分比等),则在这个非常时刻如果主线程正在进行某些操作,它们会相互阻塞!
因此,在我看来,使用 Synchronize 的唯一方式是将所有调用委托给工作线程端!例如,我们将其设置为
FreeOnTerminate := true
并且它有时会使用 Synchronize() 告诉我们它的进度,或者已经完成并将被销毁。仅在这些过程中,我们才能控制它,但它使优雅地随意关闭几乎不可能或过于复杂。我是否遗漏了什么(一些内部机制可以以某种方式克服这些死锁)?因为我有点惊讶:Synchronize() 是 Delphi 多线程手册中描述的第一个方法之一。它真的那么无用吗?