Delphi自带的indy iptcpserver 客户端第一次打开没问题,关了再打开就不行了
解决方案 »
- 数据变没的问题!
- 没有可用分了,所以
- 求SQL语句
- 如果在程序中动态创建/增加TdxSideBar控件里的Item?
- 在DELPHI下如何用最简单的方法得到某个QQ号是否在线消息?
- 請大家幫忙!呵呵.
- 各位,近来看看这个数据恢复的问题!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- 关于RadionButton,Edit,和Filtered联系在一起出现的错误,请高手们帮忙看看
- 如何让线程暂停30秒,然后运行?
- 为什么 combobox1.item[1] 跟 combobox1.item[i] 不一样呢?前者可以读出text 后者不行!
- 安装组件出现的问题
- 大吼,拉人了拉人了
1 IDTCPclient连上了,一点停止服务就死了,定住了
2 IDTCPclient连上了,退出后再上就死了,定住了
3 IDTCPclient连上了,退出后服务端关闭后进程没关,还在任务管理中代码很简单就是:procedure LinkServer(IdTCPClient1:TIdTCPClient);//登录服务器
var str :string;
begin
IdTCPClient1.host :=Frmmain.Sserverip; //连接主机
IdTCPClient1.Port := StrToInt('3125'); //端口
try
IdTCPClient1.Connect(5000); //连接
except
IdTCPClient1.Disconnect;
Application.CreateForm(Tfrmset,frmset);
Frmset .ShowModal;
end;
end;
procedure TFrmmain.IdTCPClient1Connected(Sender: TObject);
var str:string;
begin
try
str:=IdTCPClient1.ReadLn(); except
Application.MessageBox('服务器无响应!', '提示',MB_OK + MB_ICONASTERISK);
IdTCPClient1.Disconnect();
end; if str='NO' then
begin
Application.MessageBox('服务器已达到连接最大数!', '提示',MB_OK + MB_ICONASTERISK);
Application.Terminate;
end
else
begin
Frmmain. Susername:=copy(str,1,pos(' || ',str)-1);
str:= copy(str,pos(' || ',str)+6,length(str));
Frmmain. Spwd:= copy(str,1,pos(' || ',str)-1);
str:= copy(str,pos(' || ',str)+6,length(str));
Frmmain. Sinitdb:= copy(str,1,pos(' || ',str)-1);
str:= copy(str,pos(' || ',str)+6,length(str));
Frmmain. Servername:= str; end;end;
procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
with AThread.Connection do //已经连街上的一个进程
begin
if IdTCPServer1.Threads.LockList.count>strtoint(Label5.Caption) then
begin
WriteLn('NO');
end
else
begin
WriteLn(linkstr);
end;
end;
end;
AList: TList;
iLoop: Integer;
begin
if Assigned(IdTCPServer1.Threads) then
begin
AList := IdTCPServer1.Threads.LockList;
try
for iLoop := 0 to AList.Count -1 do
begin
TIdPeerThread(AList.Items[iLoop]).Connection.Disconnect;
TIdPeerThread(AList.Items[iLoop]).Stop;
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
while not TIdThreadSafeList(IdTCPServer1.Threads).IsCountLessThan(1) do
begin
Application.ProcessMessages;
Sleep(100);
end;
end;
IdTCPServer1.Active := False;
end;
先感谢了,回家试一下
现在的情况是怎么样的?我上面的代码中, 是先将Connection.Disconnect,然后将线程Stop,此时,IdTCPServer.Active还是True。如果此时客户端又申请连接的话还是会成功连接的。这时,TIdThreadSafeList(IdTCPServer1.Threads).IsCountLessThan(1)就永远不会返回True的。而且下面的IdTCPServer1.Active := False; 仍然可能会出现Timeout异常。
对此,我也没想出什么好的办法,只能修改成这样先用着:var
AList: TList;
iLoop: Integer;
begin
if Assigned(IdTCPServer1.Threads) then
begin
AList := IdTCPServer1.Threads.LockList;
try
for iLoop := 0 to AList.Count -1 do
begin
TIdPeerThread(AList.Items[iLoop]).Connection.Disconnect;
TIdPeerThread(AList.Items[iLoop]).Stop;
end;
finally
IdTCPServer1.Threads.UnlockList;
end;
iLoop := 1;
while not TIdThreadSafeList(IdTCPServer1.Threads).IsCountLessThan(1) and (iLoop < 50) do
begin
Application.ProcessMessages;
Sleep(100);
inc(iLoop);
end;
end;
while IdTCPServer1.Active do
try
IdTCPServer1.Active := False;
except
Application.ProcessMessages;
Sleep(100);
end;
end;
end;
长时间在线连接很容易实现, 发生死机最大可能性是在Execute中进行了非线程安全的操作(比如访问VCL组件)。我上面的代码是想解决IdTCPServer.Acvite := False时发生的一些问题。
idtcpserver1.Threads.LockList.Count刚才连AThread.Synchronize()同步都用上了都不行,这个东西怎么这么厉害呀,一调用就死锁经过大家的帮忙,两周的时候了,异常掉线问题终于解决了,我也累坏了,散分!!!哈哈