【发布时间】:2011-06-21 02:57:48
【问题描述】:
我希望能够在单击按钮时终止线程,例如,如果用户愿意,可以中途停止进程。显然,您可以通过监视线程中的 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 还是会杀死它所在的线程?
附:我还没有发布同步例程中的代码。一个打印到 StringGrid,一个更新 ProgressBar,第三个设置一个由 StringGrid Sync 例程使用的 op 变量,我认为此代码与问题无关,但是如果需要,我可以发布。
【问题讨论】:
-
s/digress/ramble on incessantly/:-) -
在阅读了
TThread.Terminate的文档后,上面写着“Terminate 将线程的 Terminated 属性设置为 true,表示线程应该尽快终止”,为什么你还想知道什么?是吗?另外,请记住您有源代码。如果您想知道它的作用,请打开 Classes.pas 并查看。 -
那些对 Synchronize 的调用可能会非常昂贵。为什么不直接将信息写入一个整数,确保它在 4 字节边界上对齐,并让你的主线程在计时器上定期读取它并以这种方式更新 UI。如果您花时间在线程同步上,您将失去线程的所有好处!
-
@Rob Kennedy 我已经阅读了该文档,这就是产生混淆的地方。我在这里发现了另一个问题,它也谈到了它,但它应该
TThread.Terminate会立即杀死线程,所以我认为我最好检查一下以确保安全。 @David Heffernan 好主意,谢谢 :) -
还有哪个问题告诉你
TThread.Terminate会杀死线程?你确定它说的是TThread.Terminate,而不是TerminateThread?后者是 Windows API 函数,它将立即杀死一个线程。它们是完全不同的函数,它们的调用方式也不同。
标签: multithreading delphi terminate