同步似乎挂起线程

时间:2012-04-26 20:46:23

标签: multithreading delphi delphi-xe

我有一个基于线程的消息队列,该线程处理被抛出的消息。由于线程中的某些活动可能是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中没有声明正在处理中。有人知道我做错了吗?

1 个答案:

答案 0 :(得分:4)

TThread.Synchronize()阻塞,直到主线程处理请求。主线程需要一个活动的消息循环才能处理请求(除非您定期手动调用Application.ProcessMessages()CheckSynchronize())。如果TThread.Synchronize()始终调用线程的主要工作,则完全不使用线程。您可以在主线程中使用计时器或自定义窗口消息,并消除所有不必要的复杂性。