0

尽管有仅适用于主 VCL 线程的 Application.ProcessMessages,但 TThread 类是否有类似的方法?或者我怎样才能自己写一个?

假设在客户端我使用 SendBuf 2 次...

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

在服务器端,OnRead 被触发了 2 次,但是在我们之间,我已经在一次 OnRead 调用中读取了套接字缓冲区,那么我如何避免第二次没有例外?我能想到的唯一方法是处理消息队列中的消息,以便它们已经离开那里并且不会再次触发该事件。(边读边做)

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 回答