【发布时间】:2011-12-28 09:33:46
【问题描述】:
我必须使用遗留代码。此代码在主线程中创建了一个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 完成。
我能以某种方式避免冻结吗?
谢谢。
【问题讨论】:
-
那么你在 DoTerminate 中做什么?
-
一些数据库的东西。我没有与 GUI 同步。
-
这里没有足够的代码。在线程上调用 Free 调用 Terminate,然后调用 WaitFor。这可以解释冻结吗?
-
更多代码。线程执行方法会很好。您可以在帖子中将任何机密内容替换为“SOME SQL”、“打开数据库连接”或类似内容,这样我们就可以在不违反任何 NDA/其他任何内容的情况下查看正在发生的事情。
-
您的代码显式冻结 GUI 线程,直到 WorkerThread 终止。你还能期待什么?
标签: multithreading delphi timer delphi-2009