我必须使用遗留代码。此代码在主线程中创建了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
完成之前就会冻结。
我可以以某种方式避免冻结吗?
感谢。
答案 0 :(得分:3)
这里没有足够的代码可以肯定地说出任何事情。但是,在某个主题上调用Free
会调用Terminate
,然后调用WaitFor
。等待没有返回,这与冻结的UI一致,这是非常合理的。
答案 1 :(得分:0)
这真的是倒退了。在任何体面的线程方案中,您的线程将通知您的gui-thread有关.Data.State = full的条件。你gui-thread或main-thread将采取适当的行动。我确定的一件事是WorkerThread.Free一定是错的。试图释放一个显然因任何原因被阻止的线程,保证会失败。如果线程被阻塞,Thread.Terminate也会失败,所以也没有帮助。
使用Timer监视器线程的状态永远不对。我从不使用永远和永远的单词,但是......我将重复:使用Timer监视器线程的状态永远不对。永远不能。甚至不要考虑它。