我有一个基于线程的消息队列,该线程处理被抛出的消息。由于线程中的某些活动可能是VCL命令,因此它们在Synchronize中执行。一旦调用了Synchronize,线程就会挂起。示例代码:
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中没有声明正在处理中。有人知道我做错了吗?
答案 0 :(得分:4)
TThread.Synchronize()
阻塞,直到主线程处理请求。主线程需要一个活动的消息循环才能处理请求(除非您定期手动调用Application.ProcessMessages()
或CheckSynchronize()
)。如果TThread.Synchronize()
始终调用线程的主要工作,则完全不使用线程。您可以在主线程中使用计时器或自定义窗口消息,并消除所有不必要的复杂性。