0

メイン VCL スレッド専用の Application.ProcessMessages がありますが、TThread クラスの同様のメソッドはありますか? またはどうすれば自分で書くことができますか?

クライアント側でSendBufを2回使用するとしましょう...

SendBuf(....
SendBuf(....

サーバー側では、OnRead が 2 回発生しますが、私たちの間では、1 回の OnRead 呼び出しでソケット バッファーを既に読み取っているので、例外なく 2 回目を回避するにはどうすればよいですか? 私が考えることができる唯一の方法は、メッセージキュー内のメッセージを処理して、メッセージがすでにそこから出て、そのイベントが再び発生しないようにすることです。(読みながらやってください)

4

1 に答える 1

8

ワーカー スレッドでメッセージを処理する場合は、メッセージ ループを手動で実行する必要があります。たとえば、次のようになります。

procedure TMyThread.Execute;
var
  Msg: TMsg;
begin
  ...
  while GetMessage(Msg, 0, 0, 0) > 0 then
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  ...
end;

または:

procedure TMyThread.Execute;
var
  Msg: TMsg;
begin
  ...
  while not Terminated do
  begin
    ...
    if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then
    begin
      TranslateMessage(Msg);
      DispatchMessage(Msg);
    end;
    ...
  end;
  ...
end;

または:

procedure TMyThread.Execute;
var
  Msg: TMsg;
begin
  ...
  while not Terminated do
  begin
    ...
    if MsgWaitForMultipleObjects(0, nil, FALSE, SomeTimeout, QS_ALLINPUT) = WAIT_OBJECT_0 then
    begin
      while PeekMessage(Msg, 0, 0, 0, PM_REMOVE) do
      begin
        TranslateMessage(Msg);
        DispatchMessage(Msg);
      end;
    end;
    ...
  end;
  ...
end;
于 2013-03-17T23:51:48.190 に答える