我希望能够在单击按钮时终止线程,例如,如果用户愿意,可以中途停止进程。显然,您可以通过监视线程中的 Terminated 变量来做到这一点,这意味着您可以在退出之前执行一些代码,而不是突然终止。
到目前为止的代码如下: -
单击时开始线程
procedure TForm1.Panel29Click(Sender: TObject);
var
cmpfil : TThread;
begin
if (Edit3.Text <> '') AND (Edit4.Text <> '') then
begin
Form1.ProgressBar1.Min := 0;
Form1.Progressbar1.Max := 30000;
Form1.ProgressBar1.Position := 0;
cmpfiles := TCompareFilesThread.Create();
end;
end;
创建线程
constructor TCompareFilesThread.Create;
begin
inherited Create(False);
end;
实际线程
procedure TCompareFilesThread.Execute;
var
forg, fpat : file;
byteorg, bytepat : Array[0..1023] of byte;
i,z,o : integer;
fil1,fil2 : TFilename;
begin
//Form1.CompareFiles(FEdit3Text, FEdit4Text, FGrid, FOp, FProg);
begin
fil1 := Form1.Edit3.Text;
fil2 := Form1.Edit4.Text;
if Form1.CRCAdlerGenFile(fil1,1) <> Form1.CRCAdlerGenFile(fil2,1) then //Only Run if files arn't same
begin
op := 3;
synchronize(SetOP);
i := 0;
x := 1;
o := 0;
AssignFile(forg,fil1);
FileMode := fmOpenRead;
Reset(forg,1);
AssignFile(fpat,fil2);
FileMode := fmOpenRead;
Reset(fpat,1);
//Set Progress Bar
while NOT eof(forg) do
begin
while Terminated = False do
begin
BlockRead(forg,byteorg,1024);
BlockRead(fpat,bytepat,1024);
for z := 0 to 1023 do
begin
if byteorg[z] <> bytepat[z] then
begin
synchronize(sProgBarNext);
by := bytepat[z];
off := IntToStr(o);
synchronize(SyncGrid);
inc(x);
end;
inc(o);
end;
end;
end;
CloseFile(forg);
CloseFile(fpat);
end;
end;
Free;
end;
我已经添加了While Terminated = False do
在更改时将停止该过程的行。我似乎无法弄清楚如何改变它。我从未创建过该变量;这是内置的 Delphi 功能。我已经阅读过TMyThread.Terminate()
但是我似乎无法确切地找出它的作用。它将 Terminated 设置为 True 还是会杀死它所在的线程?
PS 我还没有发布同步例程中的代码。一个打印到 StringGrid,一个更新 ProgressBar,第三个设置一个由 StringGrid Sync 例程使用的 op 变量,我认为此代码与问题无关,但是如果需要,我可以发布。