在线程中使用IDFTP时出问题。请高手帮忙啊!!(100分)

  • 主题发起人 主题发起人 sbxiang
  • 开始时间 开始时间
S

sbxiang

Unregistered / Unconfirmed
GUEST, unregistred user!
多线程程序在处理中,经常会出现某个线程死掉的情况,也不释放,而且当有一个线程死掉以后,其他线程也会马上紧跟着死掉。我如何能够在主程序中释放调死掉的线程呢。
代码如下
//主程序创建调用线程语句
//stringgrid1中每一行相当于一个任务,每个线程执行一个任务。
for j := 1 to stringgrid1.RowCount - 1do
begin
if stringgrid1.Cells[5,j] = '未处理' then
begin
if (ThreadCount < maxthread) then
begin
application.ProcessMessages;
threadcount := threadcount + 1;
with ttaskthread.Create(j,idftp1)do
begin
onterminate :=do
onterminal20;
end;
end
else
stringgrid1.Cells[6,j] := '等待空闲进程';
end;
end;


procedure TForm1.doonterminal20(Sender: TObject);
begin
ThreadCount := ThreadCount - 1;
end;



//线程声明
type
TTaskThread = class(TThread)
private
msg,errormsg,errorid,errorinfo : string;
xh :Integer;
//记录主窗体stringgrid 的行号
IdFtp1 :TidFtp;
procedure changegrid2;
//更改主窗体stringgrid1文件处理状态栏
protected
procedure Execute;
override;
Public
constructor Create(mystringgrid:tstringgrid;postid:integer;ftp:tidftp;db:tadoconnection;EtlCtrlPath:string);
destructor destroy;override;
end;

// 线程创建
constructor TTaskThread.Create(postid:integer;ftp:tidftp);
begin
IdFtp1 := Tidftp.Create(Application);
IdFtp1.Host := ftp.Host;
IdFtp1.Port := ftp.Port;
IdFtp1.Username := ftp.Username;
IdFtp1.Password := ftp.Password;
xh := postid;
FreeOnTerminate := true;
inherited Create(false);//创建线程后直接运行
end;

//线程释放
destructor TTaskThread.destroy;
begin
try
try
IdFtp1.free;
idftp1 := nil;
except
errormsg := '出错';
synchronize(changegrid2);
raise;
end;
Finally
inherited Destroy;
end;
end;


//线程执行代码
procedure TTaskThread.Execute;
var
...
begin
while not Terminateddo
begin
// ...

//准备下载数据文件
Try
IdFTP1.Get(sourcefilename, desttempfilename, TRue,FALSE);
except
Terminate;
break;
end;

//...
end;
end;


程序可以正常运行,只是有的时候会出现某个线程死在IdFTP1.Get(...)的地方,即使我的IdFTP1.Get(...)是在try中的,程序仍然不能继续执行下去。然后马上所有其他的线程也会死在这个地方。我怀疑是IDFTP和ftpserver的问题,我用的是windows IIS ftpserver。但我没办法解决。所以只好请问有没有办法能在主程序中判断某个线程死掉了,并杀掉这个线程,释放资源。
 
indy系列控件是阻塞式通信,是否某个IdFTP.Get没有响应时别的线程都分不到资源的问题。可以考虑给IdFTP的GET加上超时时限;并处理IdFTP自己的异常。这样应该好点
如果非要在主线程判断的话,估计得在线程异常时给主线程发消息了。
 
后退
顶部