indy9.0+多线程的问题 ( 积分: 200 )

  • 主题发起人 主题发起人 wjing
  • 开始时间 开始时间
W

wjing

Unregistered / Unconfirmed
GUEST, unregistred user!
我自己开发的一个多线程下载软件,使用了多线程+indy9.0.我程序运行的原理就是多线程的使用代理从一个网址下载东西.但是不知道为什么有时候线程会停止不动(假死).我想每隔一段时间就释放老线程并重新建立一个新的线程,但是现在问题出现了,在释放老的线程的时候 老是提示"线程错误 句柄无效".说明一下 就是我的多线程是使用list 列表保存的.
现在我想问的是 1.如何预防线程假死(timer 控件在indy的线程中无法运行);
2.如果上面问题没有很好的办法,怎么样才能预防错误.
我释放的代码如下 :
i:=Threadlist.count-1;
mythread:=Threadlist.item;
try
mythread.Terminate;//已经设置了 FreeOnTerminate := true;
finally
mythread.free;//这个有和没有都有错误
threadlist.delete(i);
end;
 
我自己开发的一个多线程下载软件,使用了多线程+indy9.0.我程序运行的原理就是多线程的使用代理从一个网址下载东西.但是不知道为什么有时候线程会停止不动(假死).我想每隔一段时间就释放老线程并重新建立一个新的线程,但是现在问题出现了,在释放老的线程的时候 老是提示"线程错误 句柄无效".说明一下 就是我的多线程是使用list 列表保存的.
现在我想问的是 1.如何预防线程假死(timer 控件在indy的线程中无法运行);
2.如果上面问题没有很好的办法,怎么样才能预防错误.
我释放的代码如下 :
i:=Threadlist.count-1;
mythread:=Threadlist.item;
try
mythread.Terminate;//已经设置了 FreeOnTerminate := true;
finally
mythread.free;//这个有和没有都有错误
threadlist.delete(i);
end;
 
设置TimeOut值没?idhttp.get好像有超时造成假死。
 
已经设置了 估计是线程之间冲突 线程比较少的时候 不是很明显 多了 就容易重新问题
 
线程数目最好不要超过16个,否则容易造成死机!
 
mythread:=Threadlist.item;
怕不对吧?
 
这是我以前写的代码,给你参考.........

//停止多线程发送
while(index <= count)do
begin
if FDataThread[index]<>nil then
begin
FDataThread[index].Terminate;
FDataThread[index].WaitFor;
TransServer.ShowMsg(clBlue,'向客户端输出第%d线程已停止!ThreadId=%d,发送条数=%d,接收应答条数=%d',
[index,FDataThread[index].ThreadID,SndNum[index],RecvNum[index]]);
FDataThread[index].Free;
FDataThread[index] := nil;
end;
inc(index);
end;
 
可能不是“假死”,而是线程已经释放了
 
没 错 ,,是 线程 已经是释放 了, 所以 会 找 不 到 ..
 
会不会线程结束了,而indy9还没有释放
 
后退
顶部