关于线程自已会停止的问题 急!急!急!(33分)

  • 主题发起人 主题发起人 Haishen
  • 开始时间 开始时间
H

Haishen

Unregistered / Unconfirmed
GUEST, unregistred user!
我开了一个线程为了做一个数据的操作代码如下:
Type //串播单
Map = Class(TThread)
private
procedure MapRun;
protected
procedure Execute;
override;
public
Count : Integer;
end;

procedure Map.Execute();
begin
self.FreeOnTerminate := true;
if not (self.Terminated = true) then
begin
MapRun;
end;
end;

procedure Map.MapRun();
begin
while not adoquery1.eofdo
begin
...(我的代码)
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
//调用
begin
Map.Create(false);
end;

问题是每次我的while循环没做完,线程就不知道为什么自已停止了,请问这是为什么,有什么解决办法,(注:每次线程停止的时间不一定,10次有2次while可以完成,大多数做到一个不定的地方就停止了。)
请各位帮帮忙,我先谢谢了!
 

你在线程中访问了VCL,而没有用同步的方式,
与主线程冲突导致线程终止。
改为以下方式:
procedure Map.Execute();
begin
self.FreeOnTerminate := true;
if not (self.Terminated = true) then
begin
Synchronize(MapRun);
end;
end;
 
同意楼上的说法,或者线程内创建时自动创建一个内部使用的QUERY对象可能会更好
我都是这么做,也没见有什么异常,很方便的
 
上面几位,我把线程放在Synchronize()中确实没有出现停止的问题,但有出了另外一个问题,
我在线程中调用Form上的控件如:让Label显示数据进行的条数,开始还没问题显未的很好,但
运行一段时间后Label就显示不过来了,请问有什么办法,我每过一条数据让Label里的数字加1,并
且进行了Refresh,可还是不行。
 
synchronize实际是用的主进程的时间片。 也就是说, synchronize中的代码执行完成前, 主进程没机会刷新屏幕。
 
Label显示没有问题的,我做过,是不是你的代码本身有问题呀?[:D]
 
用了synchronize后,实际上和你在主线程中用MapRun没什么两样,这样多线程就成了多余
之举。 你想真正在线程里面实现遍历数据库的话,得在线程中动态创建adoquery组件。假如
你仅仅是为了在遍历的时候显示查询进度,那根本无需用到线程,只要这样就可以了:
procedure Map.MapRun();
begin
while not adoquery1.eofdo
begin
...(我的代码)
//在这里显示当前recordno
application.ProcessMessages;
end;
end;
 
后退
顶部