Timer.OnTimer是否导致工作线程与主线程同步?

时间:2011-12-28 09:33:47

标签: multithreading delphi timer delphi-2009

我必须使用遗留代码。此代码在主线程中创建了TTimer。 在OnTimer事件中,计时器定期检查工作线程中某些数据的状态。

伪代码:

procedure MainForm.OnTimer(Sender: TObject);
begin
  if WorkerThread.Data.State = full then
  begin
    WorkerThread.Free; //This freezes GUI.    
  end else
   //Do something else.
end;

问题是我希望在WorkerThread终止时执行一些后台操作。为了避免同步,我覆盖了DoTerminate方法。但是在这种特殊情况下,这没有帮助,我的GUI在DoTerminate完成之前就会冻结。

我可以以某种方式避免冻结吗?

感谢。

2 个答案:

答案 0 :(得分:3)

这里没有足够的代码可以肯定地说出任何事情。但是,在某个主题上调用Free会调用Terminate,然后调用WaitFor。等待没有返回,这与冻结的UI一致,这是非常合理的。

答案 1 :(得分:0)

这真的是倒退了。在任何体面的线程方案中,您的线程将通知您的gui-thread有关.Data.State = full的条件。你gui-thread或main-thread将采取适当的行动。我确定的一件事是WorkerThread.Free一定是错的。试图释放一个显然因任何原因被阻止的线程,保证会失败。如果线程被阻塞,Thread.Terminate也会失败,所以也没有帮助。

使用Timer监视器线程的状态永远不对。我从不使用永远和永远的单词,但是......我将重复:使用Timer监视器线程的状态永远不对。永远不能。甚至不要考虑它。

  • 都灵