多线程自动退出问题!(100分)

  • 主题发起人 主题发起人 meme258
  • 开始时间 开始时间
M

meme258

Unregistered / Unconfirmed
GUEST, unregistred user!
程序中开启10个线程,做同一个工作 网络采集
1个线程里面 调用自己的excute 实现循环,但是执行一段时间以后(具体时间长短不确定)所有线程就都不工作了,主界面还是可以相应操作(没有假死),
请教高人,如何解决。
 
那是运行到一个条件中然后都被挂了,检查一下你的线程中这类的操作
Suspend
 
>>1个线程里面 调用自己的excute 实现循环
不应该是这样啊。当线程被创建后,Execute方法会在Resume后自动被操作系统执行,而
无需显式的调用该方法。检查一下线程内是否等待了什么事件或资源吧(最好定期的向主线
程“报告”自己的工作情况)。
 
我的代码是这样的
Execute 里执行 一个函数 Cto 这个函数里面 调用自己,
也就是说,Execute 要等到 循环全部完成 这个线程才算 执行完毕。
线程里面的动作,主界面都有报告显示的,但是最后不执行了,就没有显示了,
子瑜 兄,线程里面,我没有 挂起的操作,,如果是某个线程的某一个步骤 出现异常 也不会导致全部被挂起吧。。
 
子瑜 兄,线程里面,我没有 挂起的操作,,如果是某个线程的某一个步骤 出现异常 也不会导致全部被挂起吧。。
======================
那就很可能是发生死锁了!
 
你是不是直接在现成中调用Form资源!
 
楼上兄弟,不是
经过仔细排查,找出了出错的地方,但是还未找到解决办法
下面这个函数 ,偶尔执行到 .open 或者 .send的时候会出现,找不到指定的资源,指定资源下载失败的错误,一出错就整个线程都停止工作,线程没有执行完毕,也没有挂起,
try 没用,

function GetWebPage(const url: string): string;
var
d:IXMLHttpRequest;
ay: array of byte;
str:string;
a:integer;
begin

d := CoXMLHTTPRequest.Create;
try
try
d.open('get', url, false, EmptyParam, EmptyParam);
d.send('');
except
Result := '';
d := nil;
Exit;
end;
if (d.readyState = 4) and (d.status = 200) then
begin
ay := d.responseBody;
for a:=Low(ay) to High(ay)do
//将字节转换成字符
str:=str+chr(ay[a]);
ay:=nil;
//mmo1.Text := str;
Result := str;
end;
finally
d := nil;
end;

end;
 
后退
顶部