关于ID的几个问题:如何解决IdTCPServer的连接线程死掉的问题 如何强制停止IdTCPServer的线程。(其实都是相关的)(200分)

  • 主题发起人 主题发起人 wddark
  • 开始时间 开始时间
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出现死连接,出现的话怎么监测?(没有被冻结就是不工作真气人,连接也建立) 真正不行得能让我可以关闭服务器也行,谢谢各位:)
 
onclose事件、onExecute事件都是很多线程共同调用的,这就存在一个同步的问题,用临界区!
 
老兄,不对吧?我这不是要同步它们而是要强行释放线程,今天上午连TerminateProcess都试过了,窗体关闭然后就非法操作,然后发现还是无法释放那些连接线程!id究竟用了什么东东这么顽固
 
-_-!找到问题了,冤枉id了,我接收别人的代码 它再线程里面动态建立adoquery连接 ,可是竟然用的是同一个ModuleProvider上面的adoconn! 而且还吃掉了全部的异常。。。吐血,原来真正的原因是经典的ole error 800A0E7F 改成动态生成adoconn就ok啦
也谢谢楼上的朋友帮忙
 
??没法结帖, 把分给这位朋友吧。浮云浮云:)
一起进步
 
后退
顶部