有没有办法用Timeout做TThread.Synchronize?

时间:2018-03-21 19:31:53

标签: delphi

有时您需要拨打TThread.Synchronize,但也可以输入死锁情况。

例如:

Thread1.execute
procedure
begin
  ....
  TThread.Synchronize(..)
  ...
end;

然后从主线程执行类似的操作:

Thread1.terminate;
Thread1.waitfor;

会因为TThread.Synchronize永远不会成功而陷入僵局:( 我想知道处理这种情况最简单的方法。

1 个答案:

答案 0 :(得分:6)

暂停时无法使用TThread.Synchronize()

您可以使用TThread.Queue()来传递与TEvent相关联的过程,您可以在Queue()退出后等待。然后主线程可以在处理请求时发出TEvent信号(只要确保在主线程使用它之后不释放TEvent,除非你调用TThread.RemoveQueuedEvents()取消请求第一)。

话虽如此,你所描述的并不是僵局。如果在主UI线程中调用TThread.WaitFor(),它会在等待线程终止时处理挂起的Synchronize() / Queue()请求。如果在另一个线程中调用TThread.WaitFor(),则主UI线程可以正常处理Synchronize() / Queue()个请求。