用什么方法中止线程?(100分)

  • 主题发起人 主题发起人 goodfox2002
  • 开始时间 开始时间
G

goodfox2002

Unregistered / Unconfirmed
GUEST, unregistred user!
Constructor TMyThread.Create(No:integer);
begin
Inherited Create(False);
//线程建立后立刻开始执行
FNo:=No;
FTolist:=TStringlist.Create;
FTSession := TSession.Create(nil);
FTDatabase := TDatabase.Create(nil);
FTQuery := TQuery.Create(nil);
FTQDB := TTable.Create(nil);
FTSession.SessionName := 'MySession'+inttostr(FNo);
FTDatabase.DatabaseName := 'MySUNMAILDB'+inttostr(FNo);
FTDatabase.Directory:= ExtractFilePath(ParamStr(0));
FTDatabase.SessionName := FTSession.SessionName;
FTQuery.SessionName := FTSession.SessionName;
FTQuery.DatabaseName := FTDatabase.DatabaseName;
FTQDB.SessionName := FTSession.SessionName;
FTQDB.DatabaseName := FTDatabase.DatabaseName;
FTQDB.TableName := 'MYDB';
FTQDB.Open;
FreeOnTerminate:=True;
end;

Procedure TMyThread.Execute;
begin
repeat
execThread;
until SunStatus=0;
end;

procedure TFSunMail.TBtnStartClick(Sender: TObject);
begin
if SunStatus>0 then
begin
for k:=1 to SEdtThreadNum.Valuedo
SunThd[k]:=TMyThread.Create(k);
TBtnStop.Enabled:=True;
TBtnBack.Enabled:=True;
end;
end;

procedure TFSunMail.TBtnStopClick(Sender: TObject);
var
k:integer;
stop:Boolean;
begin
SunStatus:=0;
repeat
stop:=True;
for k:=1 to SEdtThreadNum.Valuedo
if SunThd[k]<>nil then
stop:=False;
until stop;
TBtnStart.Enabled:=True;
TBtnStop.Enabled:=False;
TBtnBack.Enabled:=False;
end;

1、程序在建立线程和执行时正常,可以停止按钮不能停止线程。
在repeat这里死循环,
照说 FreeOnTerminate:=True;
当 SunStatus:=0;时线程应自动停止并释放。
2、去掉repeat也不行,重新按开始则报告线程已经存在。
3、用 for k:=1 to SEdtThreadNum.Valuedo
SunThd[k].terminate;
也没有用。
请各位指出程序的错误,
或是不是要在OnTerminate中释放TQuery等对象?
如何在OnTerminate中释放TQuery等对象?
 
Procedure TMyThread.Execute;
//修改代码如下
while (not Terminated) and (SunStatus<>0)do
execThread;
end;

终止MyThread:TMyThread;
中止线程只需要,但是最好先判断
if assagned(MyThread) then
MyThread.Terminate;//就可以了
这样你的线程就可以接到退出命令,你在
OnTerminate事件里释放资源就OK了
 
已经有点眉目,等调试好了在给分。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部