我得到的印象是,一个应该至少可以从主线程控制的线程根本不能使用Synchronize():任何尝试这样做几乎立即导致一种情况下的死锁.
因此,应该避免onTerminate事件,因为它使用Synchronize调用.
例如,我有一个线程,它做了一些艰苦的背景工作.我希望在状态栏中观察其进度,并且如果用户按下关闭按钮,则能够"优雅地"停止它.
我无法使用FreeOnTerminate := true,因为当线程被启动时,我根本不能调用它的任何方法:它可能随时被销毁并且我得到访问冲突(或完全损坏了某些东西).
因此,线程破坏是主线程的责任.在某种DoTerminate过程中完成所有"完成"工作并将onTerminate事件指向它是合乎逻辑的.但那是死锁:我们无法从DoTerminate释放线程,因为在TThread.Free中有WaitFor,在同步onTerminate事件完成之前无法完成.
不只是OnTerminate:如果工作线程中有任何Synchronize调用(例如,它想告诉我们已经完成了一些工作的百分比等),那么如果在这个时刻主线程要做什么就有可能发生死锁与工人线程:他们互相阻止!
所以,根据我的理解,使用Synchronize的唯一方法是将所有调用委托给工作线程端!例如,我们使用它,FreeOnTerminate := true它有时使用Synchronize()告诉我们它的进度,或者它已经完成并将被销毁.只有在这些程序中我们才能控制它,但它会"随意"优雅地关闭,几乎不可能或过于复杂.
我错过了什么(一些内部工作有助于以某种方式克服这些死锁)?因为我有点惊讶:Synchronize()是Delphi多线程手册中描述的第一个方法之一.它真的没用吗?