导航

心动吧DELPHI网络书

自发研究:须要多维思想而且要想不可能为可能的人才能做到

« 阻塞方式下的Socket应用Windows 消息 »

为什么我的在线程里面创建ClientSocket1后无法激活事件呢

  当我们实在需要用到线程创建线程的时候,就必需先把第一个线程设置为等待,等待第二个VCL线程处理完毕后才能继续执行下去,否则会出现只执行一半就不执行的后果..

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;



 

----------------------------------------------------------------------------------------------------------------------------

以下是解决方法

汗,你这都写了什么啊,线程的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    //因为Tclinetsocket1会创建其他线程,而execute线程执行完后,那么其他在内创建的线程也就不存在了,所以此时需要让他等待前面的结束才行
begin
{加入你要处理的代码}
Sleep(1);
end;
end;
end;

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

更详细的

 

procedure Tpost.Execute; 
var
MsgRec:TMsg;
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;
引用 4 楼 y9165102 的回复:

一下子想不通

while not Terminated do

  begin

    {加入你要处理的代码}

    Sleep(1);

  end;

中间的作用域是用来做什么的

 

引用 4 楼 y9165102 的回复:

一下子想不通

while not Terminated do

  begin

    {加入你要处理的代码}

    Sleep(1);

  end;

中间的作用域是用来做什么的

 

因为如果你不添加这个的话,Execute执行完之后,线程就不存在了,而你的clientSocket1是在线程当中创建并依赖线程执行而执行的。



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

原创文章如转载,请注明:转载自心动吧DELPHI网络书 [ http://www.abcxd.com/delphi/ ]

本文链接地址:http://www.abcxd.com/delphi/abcxddelphi/DELPHITS/322/

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

搜索内容

日历

Copyright ⊙ 2004-2009 心动吧 UrL:ABCXD.CoM All RiGhts Reserved