我是使用timer控件来控制TcpClient从tcpServer读入数据的  Msg := IdTCPClient1.ReadLn('', 5);但是timer控件有一定的时间限止,比如说,我的是1000毫秒,请问,我怎么样才能使tcpClient像tcpServer一样,有一个OnExecute事件,即indyTcpClient只有当接收到TcpServer发来的消息时,才会触发事件,而其它时间是不会触发事件的。谢谢

解决方案 »

  1.   

    判断当indyTcpClient接收到TcpServer发来的消息,就写你需要发生的代码呀。
      

  2.   

    接收数据的线程示例。
    我这里用消息来通知主窗体,你可以用回调函数,这个很灵活的。
    unit Thread;interfaceuses
      Classes, IdTCPClient, Windows, Messages;type
      TRecvThread = class(TThread)
      private
        FTCPClient: TIdTCPClient;
        FHandle: Cardinal;
      protected
        procedure Execute; override;
      public
        constructor Create(TCPClient: TIdTCPClient; hWnd: Cardinal);
      end;implementation{ TRecvThread }constructor TRecvThread.Create(TCPClient: TIdTCPClient; hWnd: Cardinal);
    begin
      inherited Create(false);
      FreeOnTerminate:=true;
      FTCPClient:=TCPClient;
      FHandle:=hWnd;
    end;procedure TRecvThread.Execute;
    var
      Count: Integer;
      P: PByte;
    begin
      while (not Terminated) and FTCPClient.Connected do
      begin
        Count:=FTCPClient.ReadFromStack(false);
        if Count<>0 then
        begin
          GetMem(P, Count);
          FTCPClient.ReadBuffer(P^, Count);
          SendMessage(FHandle, WM_USER+1000, Integer(P), Count);
          FreeMem(P, Count);
        end;
      end;
    end;end.主窗体示例(部分):
    uses Thread;procedure TForm1.FormCreate(Sender: TObject);
    begin
      TRecvThread.Create(IdTCPClient1, Handle);
    end;//消息处理函数
    procedure TForm1.Recv(var Msg: TMessage);
    beginend;
      

  3.   

    我也遇到这样的问题,那onwork事件是干吗用的?
      

  4.   

    var
      ires,i : integer;
      recMsg : TMyMsg;  //一个record
    begin
      { Place thread code here }
      FreeOnTerminate := True;  while ((not Terminated) and DM.tcpLog.Connected) do
      begin
        ires := DM.tcpLog.ReadFromStack;
        if ires > 0 then
        begin
          DM.tcpLog.ReadBuffer(recMsg,sizeof(recMsg));
          case recMsg.iType of
          3 :
            begin
              frm_clientMain.meorec.Lines.Add(recMsg.UserName+' 说:');
              frm_clientMain.meorec.Lines.Add(recMsg.sMsg);
            end;
          2 :
            begin
              i :=  Namelist.IndexOf(recMsg.UserName);
              if i > -1 then
              begin
                StatList.Strings[i] := IntToStr(recMsg.istat);
                frm_clientMain.ListView1.Items[i].ImageIndex := recMsg.istat;
                frm_clientMain.ListView1.Repaint;
              end;
            end;
          end;
        end;
      end;
    end;
    这是我的,已经成功
      

  5.   

    采用线程可以的,在INDY的例子中使用的就是线程,它还有一个CHAt的目录,是网络聊天程序,也是采用线程的方式的