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等对象?
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等对象?