有时您需要拨打TThread.Synchronize
,但也可以输入死锁情况。
例如:
Thread1.execute
procedure
begin
....
TThread.Synchronize(..)
...
end;
然后从主线程执行类似的操作:
Thread1.terminate;
Thread1.waitfor;
会因为TThread.Synchronize
永远不会成功而陷入僵局:(
我想知道处理这种情况最简单的方法。
答案 0 :(得分:6)
暂停时无法使用TThread.Synchronize()
。
您可以使用TThread.Queue()
来传递与TEvent
相关联的过程,您可以在Queue()
退出后等待。然后主线程可以在处理请求时发出TEvent
信号(只要确保在主线程使用它之后不释放TEvent
,除非你调用TThread.RemoveQueuedEvents()
取消请求第一)。
话虽如此,你所描述的并不是僵局。如果在主UI线程中调用TThread.WaitFor()
,它会在等待线程终止时处理挂起的Synchronize()
/ Queue()
请求。如果在另一个线程中调用TThread.WaitFor()
,则主UI线程可以正常处理Synchronize()
/ Queue()
个请求。