使用indy时候,IdTCPServer怎么会出现死循环啊(100分)

  • 主题发起人 主题发起人 lygzerg
  • 开始时间 开始时间
L

lygzerg

Unregistered / Unconfirmed
GUEST, unregistred user!
小弟今天第一次学INDY,用在一个网络考试环境中。
问题1
代码:
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
with AThread.Connection do
begin
ShowMessage('test');
Exit;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
IdTCPClient1.Host:=Edit1.Text;
IdTCPClient1.Port:=StrToInt(Edit2.Text);
IdTCPClient1.Connect;
IdTCPClient1.Disconnect;
end;
当客户端按下的时候,服务器端不段的弹出ShowMessage('test');,好象是个死循环,CPU使用率很快就100%了,搞不懂。
----------------------
问题2
当有好多个客户端连接上来的时候,如何定期测试这些客户端是否还在线?
----------------------
问题3
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
IP:string;
begin
//获取客户机IP
with AThread.Connection do
begin
IP:=AThread.Connection.Socket.Binding.PeerIP;
//查找DBGRID中是否已经存在
DataModule1.mainadoquery.Close;
DataModule1.mainadoquery.SQL.Clear;
DataModule1.mainadoquery.SQL.Add('select * from 考试状态 where IP='+''''+IP+'''');
DataModule1.mainadoquery.Open;

if DataModule1.mainadoquery.RecordCount<=0 then
begin
DataModule1.mainADOTable1.Append;
DataModule1.mainADOTable1.FieldByName('IP').Value:=IP;
DataModule1.mainADOTable1.Post;
DataModule1.mainADOTable1.Active:=true;
end;
}
Exit;
end;
end;
思路是:当有个客户断连接的时候,我会在数据表找查找是否存在这个IP,如果不在就加入,如果存在就显示在线,不知道是否有更好的办法。
INDY在多客户端并发的时候上面操纵数据表能进行么?我好象在调试的时候,提示不能在并法状态下进行操作,不知道为何?
------------------------
多谢前辈指教,在线等待!
 
1.在Execute里接收到的所有的信息.
2.是否在线应该在内存中维护这个状态好一些吧.
3.发送文件的时候首先读一个文件,然后依次发送,既先Read(10)然后Send(10)个,直到全部发送完毕,为了接收方便,可能每一次发送的时候可能要加一些头信息,以区别此次发送的是文件的内容.
 
1, 当Execute还没有退出的时候,TIdPeerThread已经开始再次触发了Execute,如此循环,造成了那个现象。就仿佛在线程里单独用ShowMessage一样。取消那个ShowMessage还会出错吗?
2, Indy的控件应该有这个功能吧。
3, 主要出现在数据库操作上。
4, 我看用什么发送。只要两边定义好了,总是可以的。
 
TIdPeerThread继承自TThread 看看TThread VCL不支持线程 所以onExecute不要出现界面显示。如果需要最好用同步函数。
 
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
begin
if not AThread.Terminated and AThread.Connection.Connected then
begin
with AThread.Connection do
begin
ShowMessage('test');
Exit;
end;
end;
end;
 
后退
顶部