procedure Tpost.Execute;
begin
  { Place thread code here }
 clientsocket1:=Tclientsocket.Create(nil);  //创建clien
 clientsocket1.OnConnect:=ClientSocket1Connect;  //连接事件
 clientsocket1.OnConnecting:=ClientSocket1Connecting;  //连接事件
 if (form1.Edit1.text<>'') and (form1.Edit2.text<>'') then
 begin
  if form1.clientsocket1.active=true then  
    form1.clientsocket1.Close;
  headbuff:=form1.memo1.Text;      //取内容
  contentbuff:=form1.memo2.Text;   //取内容
  clientsocket1.host:=form1.Edit1.Text; 
  clientsocket1.Port:=strtoint(form1.Edit2.text);
  clientsocket1.Open;
 end;
end;
  为什么我的OnConnect和OnConnecting无法激活呢?
procedure Tpost.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
form1.statusbar1.SimpleText:='与服务器'+clientsocket1.Address+'成功建立连接';
Socket.SendText(headbuff);
Socket.sendtext(contentbuff);
end;procedure Tpost.ClientSocket1Connecting(Sender: TObject;
  Socket: TCustomWinSocket);
begin
form1.statusbar1.SimpleText:='正在与服务器'+clientsocket1.Address+'建立连接';
end;
   是不是需要消息循环,但我看了一些文章无法理解其中.希望有人能帮我解答一下.

解决方案 »

  1.   

    问题可能是出现在
    clientsocket1.OnConnect:=ClientSocket1Connect;  //连接事件
    clientsocket1.OnConnecting:=ClientSocket1Connecting;  //连接事件
    这两处。另外,一定要动态建立Tclientsocket吗?
      

  2.   

    汗,你这都写了什么啊,线程的Execute过程是执行完毕就free掉当前线程的(或者挂起),而你这个Execute过程中没有循环等待,应该这样修改:procedure Tpost.Execute;
    begin
      { Place thread code here }
     clientsocket1:=Tclientsocket.Create(nil);  //创建clien
     clientsocket1.OnConnect:=ClientSocket1Connect;  //连接事件
     clientsocket1.OnConnecting:=ClientSocket1Connecting;  //连接事件
     if (form1.Edit1.text<>'') and (form1.Edit2.text<>'') then
     begin
      if form1.clientsocket1.active=true then  
        form1.clientsocket1.Close;
      headbuff:=form1.memo1.Text;      //取内容
      contentbuff:=form1.memo2.Text;   //取内容
      clientsocket1.host:=form1.Edit1.Text; 
      clientsocket1.Port:=strtoint(form1.Edit2.text);
      clientsocket1.Open;
      while not Terminated do
      begin
        {加入你要处理的代码}
        Sleep(1);
      end;
     end;
    end;
      

  3.   

    如果不动态创建的话,难道由界面传一个clientsoket进去线程吗?我试过,但是一样没用..
      

  4.   


     一下子想不通
     while not Terminated do
      begin
        {加入你要处理的代码}
        Sleep(1);
      end;
     中间的作用域是用来做什么的
      

  5.   

    procedure Tpost.Execute;
    begin
      { Place thread code here }
     clientsocket1:=Tclientsocket.Create(nil);  //创建clien
     clientsocket1.OnConnect:=ClientSocket1Connect;  //连接事件
     clientsocket1.OnConnecting:=ClientSocket1Connecting;  //连接事件
     if (form1.Edit1.text<>'') and (form1.Edit2.text<>'') then
     begin
      if form1.clientsocket1.active=true then  
        form1.clientsocket1.Close;
      headbuff:=form1.memo1.Text;      //取内容
      contentbuff:=form1.memo2.Text;   //取内容
      clientsocket1.host:=form1.Edit1.Text; 
      clientsocket1.Port:=strtoint(form1.Edit2.text);
      clientsocket1.Open;
      //这里添加一个MessageLoop
      //例如:
        while GetMessage(MsgRec, 0, 0, 0) do begin
          TranslateMessage(MsgRec);
          DispatchMessage(MsgRec)
        end;
        Terminate;

     end;
    end;
      

  6.   

    因为如果你不添加这个的话,Execute执行完之后,线程就不存在了,而你的clientSocket1是在线程当中创建并依赖线程执行而执行的。使用这个能够实现阻塞模式。使用上面5楼的方式可以实现异步消息模式(差不多跟添加到Form当中相似了,只是执行的线程不同,所以在各事件当中最好不要操作VCL,如果需要操作,请使用相关的安全同步函数)。
      

  7.   

    我写入了此行代码也一样没用,原因是他根本就没去执行那些事件,我单步走了很多次都没有跳到事件那里执行..请问是什么原因呀
     while not Terminated do
      begin
        {加入你要处理的代码}
        if form1.Memo3.Text<>'' then
        break;
        Sleep(1);
      end;
     end;
     form1.Memo3.Lines.Add('终止');