【发布时间】:2012-04-26 20:46:23
【问题描述】:
我有一个基于线程的消息队列,该线程处理抛出的消息。由于线程中的某些活动可能是 VCL 命令,因此它们在同步中执行。只要调用同步,线程就会挂起。示例代码:
TMessageQ = class (TThread)
...
procedure TMessageQ.do_msg;
begin
case CurrentMessage.Command of
cQSize: if Assigned (OnSize) then OnSize (CurrentMessage);
cQReady: if Assigned (OnReady) then OnReady (CurrentMessage);
end; // case
end; // do_msg /
procedure TMessageQ.doTask (Sender: TObject);
begin
while FQ.Count > 0 do
begin
FSection.Enter;
try
CurrentMessage := FQ.Dequeue;
finally
FSection.Leave;
end; // try..finally
Synchronize (do_msg);
end; // while
end; // doTask //
do_msg 中没有任何语句被处理。有人知道我做错了什么吗?
【问题讨论】:
-
主线程发生了什么?同步需要 MessageLoop。如果主线程正在等待这个,那么它就会出现。
-
Hank +1 - 确定 Delphi 应用程序死机的第一大原因 - TThread.Synchronize 和(可能)TThread.WaitFor()。就像 Hank 所说,无论您在 GUI 线程中做什么,都停止执行,退出事件处理程序并继续处理消息。如果在这个阶段,“Application.ProcessMessages”这个短语正在通过你的大脑 - 清除它:)
-
恐怕你是对的(见下面的评论)。并感谢您对 Application.ProcessMessages 的警告:-)。我会在晚上测试这个。
-
是的,你是对的。在 remy 的回答中查看我的评论。
标签: multithreading delphi delphi-xe