W
wddark
Unregistered / Unconfirmed
GUEST, unregistred user!
一个比较简单的应用程序IdTCPServer+IdTCPClient,开发环境为win2000server sp4+d6 sp2+indy9
client多线程生成多个IdTCPClient连接以后请求server下载文件(当然各个线程下载的文件不一样,也就是说不是多线程下载一个文件)。一般没有什么问题,但是发现偶尔会出现server线程死锁,表现为连接正常,但是连接以后server就是不去读取client的请求,client也得不到server传递过来的数据。而且和server负载量无关,只有3个线程的时候也会出现!出现是就像线程不能被resume一样,cpu占用率一直很低。 此时我的客户端可以停掉该连接,释放客户端线程一切正常。但是server这样的“死”线程一直无法释放。 server无法正常关闭,报错线程关闭超时。server的对TIdPeerThread的操作中没有死循环,而且又很多的判断
if Thread.Terminated=true then exit;这样的判断。
服务器onclose事件里面
var
ls:TList;
begin
ls:=DownloadService.Threads.LockList;
for i:=0 to ls.Count-1 do
begin
TIdPeerThread(ls.Items).Connection.DisconnectSocket;
TIdPeerThread(ls.Items).Terminate;
end;
无效!
把TIdPeerThread(ls.Items).Terminate;改成exitThread还是无效。无奈之下使用msdn里面不推荐的terminatethread,竟然还是无效!如果有死连接 表现为服务器窗体关闭,用任务管理器可以看到进程还存在,不占用cpu,内存占用很小。也就是说能释放的内容确实释放了,但是还有一些,我是没辙了。请各位有这方面经验的帮帮忙 谢谢啦,最好不让idtcpserver出现死连接,出现的话怎么监测?(没有被冻结就是不工作真气人,连接也建立) 真正不行得能让我可以关闭服务器也行,谢谢各位
client多线程生成多个IdTCPClient连接以后请求server下载文件(当然各个线程下载的文件不一样,也就是说不是多线程下载一个文件)。一般没有什么问题,但是发现偶尔会出现server线程死锁,表现为连接正常,但是连接以后server就是不去读取client的请求,client也得不到server传递过来的数据。而且和server负载量无关,只有3个线程的时候也会出现!出现是就像线程不能被resume一样,cpu占用率一直很低。 此时我的客户端可以停掉该连接,释放客户端线程一切正常。但是server这样的“死”线程一直无法释放。 server无法正常关闭,报错线程关闭超时。server的对TIdPeerThread的操作中没有死循环,而且又很多的判断
if Thread.Terminated=true then exit;这样的判断。
服务器onclose事件里面
var
ls:TList;
begin
ls:=DownloadService.Threads.LockList;
for i:=0 to ls.Count-1 do
begin
TIdPeerThread(ls.Items).Connection.DisconnectSocket;
TIdPeerThread(ls.Items).Terminate;
end;
无效!
把TIdPeerThread(ls.Items).Terminate;改成exitThread还是无效。无奈之下使用msdn里面不推荐的terminatethread,竟然还是无效!如果有死连接 表现为服务器窗体关闭,用任务管理器可以看到进程还存在,不占用cpu,内存占用很小。也就是说能释放的内容确实释放了,但是还有一些,我是没辙了。请各位有这方面经验的帮帮忙 谢谢啦,最好不让idtcpserver出现死连接,出现的话怎么监测?(没有被冻结就是不工作真气人,连接也建立) 真正不行得能让我可以关闭服务器也行,谢谢各位