2

我有一个基于线程的消息队列,该线程处理被抛出的消息。由于线程中的某些活动可能是 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 中的任何语句都不会被处理。有人知道我做错了什么吗?

4

1 回答 1

4

TThread.Synchronize()阻塞直到主线程处理请求。主线程需要一个活动的消息循环来处理请求(除非您手动调用Application.ProcessMessages()CheckSynchronize()定期调用)。如果您的线程的主要工作总是由 调用TThread.Synchronize(),那么使用线程根本没有意义。您可以只在主线程中使用计时器或自定义窗口消息,并消除所有不必要的复杂性。

于 2012-04-27T00:50:03.953 回答