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。但我没办法解决。所以只好请问有没有办法能在主程序中判断某个线程死掉了,并杀掉这个线程,释放资源。
代码如下
//主程序创建调用线程语句
//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。但我没办法解决。所以只好请问有没有办法能在主程序中判断某个线程死掉了,并杀掉这个线程,释放资源。