Indy自带的Demo里,是在连接成功后创建了一个线程来监听连接里是否有消息进来的,代码如下:  TClientHandleThread = class(TThread)
                         private
                          CB: TCommBlock;                          procedure HandleInput;                         protected
                          procedure Execute; override;                        end;var
  ClientFrmMain: TClientFrmMain;
  ClientHandleThread: TClientHandleThread;   // variable (type see above)implementation{$R *.DFM}procedure TClientHandleThread.HandleInput;
begin
  if CB.Command = 'MESSAGE' then
    ClientFrmMain.IncomingMessages.Lines.Add (CB.MyUserName + ': ' + CB.Msg)
  else
  if CB.Command = 'DIALOG' then
    MessageDlg ('"'+CB.MyUserName+'" sends you this message:'+#13+CB.Msg, mtInformation, [mbOk], 0)
  else  // unknown command
    MessageDlg('Unknown command "'+CB.Command+'" containing this message:'+#13+CB.Msg, mtError, [mbOk], 0);
end;procedure TClientHandleThread.Execute;
begin
  while not Terminated do
  begin
    if not ClientFrmMain.Client.Connected then
      Terminate
    else
    try
      ClientFrmMain.Client.ReadBuffer(CB, SizeOf (CB));
      Synchronize(HandleInput);
    except
    end;
  end;
end;procedure TClientFrmMain.CBClientActiveClick(Sender: TObject);
begin
  if CBClientActive.Checked then
  begin
    try
      Client.Connect(10000);  // in Indy < 8.1 leave the parameter away      ClientHandleThread := TClientHandleThread.Create(True);
      ClientHandleThread.FreeOnTerminate:=True;
      ClientHandleThread.Resume;
    except
      on E: Exception do MessageDlg ('Error while connecting:'+#13+E.Message, mtError, [mbOk], 0);
    end;
  end
  else
  begin
    ClientHandleThread.Terminate;
    Client.Disconnect;
  end;  ButtonSend.Enabled := Client.Connected;
  CBClientActive.Checked := Client.Connected;
end;procedure TClientFrmMain.ButtonSendClick(Sender: TObject);
var
  CommBlock : TCommBlock;begin
  CommBlock.Command      := EditCommand.Text;         // assign the data
  CommBlock.MyUserName   := Client.LocalName;
  CommBlock.Msg          := EditMessage.Text;
  CommBlock.ReceiverName := EditRecipient.Text;  Client.WriteBuffer (CommBlock, SizeOf (CommBlock), true);
end;
我的问题是它创建的这个监听线程,是怎么做到的有信息来时才进去显示操作(Synchronize(HandleInput);
)的,我想的是它既然是个线程,只要Terminated为真,它就会一直的读呀,而会把空消息也读进来的。我在线程里下过断点,实际情况是只有有消息进来时才进行显示操作,没消息时进不来。。这是为什么,请大家知道的解解惑。

解决方案 »

  1.   

    不就是在Execute中吗,Execute就是线程执行体,里面是个while循环,在那里一直检测,有读取数据,然后同步HandleInput
      

  2.   


    是的,但我们平时创建一个线程,也这样写的话,不是会在那个While循环里一直重复,而不受其他影响么,它那个是只有收到消息才进去,下过断点测试过的,到这里就看不懂了。
      

  3.   

    你那个写法,Execute会一直执行,只要连接正常就ReadBuffer,然后就同步