2

スローされたメッセージを処理するスレッドに基づくメッセージキューがあります。スレッド内の一部のアクティビティはVCLコマンドである可能性があるため、同期で実行されます。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のステートメントは処理されていません。誰かが私が間違っていることを知っていますか?

4

1 に答える 1

4

TThread.Synchronize()メインスレッドがリクエストを処理するまでブロックします。メインスレッドでは、リクエストを処理するためにアクティブなメッセージループが必要です(手動Application.ProcessMessages()またはCheckSynchronize()定期的に呼び出す場合を除く)。スレッドの主な作業が常にによって呼び出されている場合、TThread.Synchronize()スレッドを使用しても意味がありません。代わりに、メインスレッドでタイマーまたはカスタムウィンドウメッセージを使用して、不要な複雑さをすべて取り除くことができます。

于 2012-04-27T00:50:03.953 に答える