Я хочу, чтобы можно было прекратить поток нажатием кнопки, например, остановить процесс на полпути, если пользователь хочет. По-видимому, вы можете сделать это, помазав за конечную переменную в потоке, а это значит, что вы можете затем выпустить некоторый код перед выходом, а не внезапно завершать.Завершить тему, запустив код перед выходом
код до сих пор выглядит следующим образом: -
резьб по щелчку
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;
Actual Thread
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()
, однако я не могу точно узнать, что это делает. Устанавливает ли оно значение «Завершение» на «Истина» или просто убивает поток, где он стоит?
P.S. Я не размещал код из синхронизированных подпрограмм. Один печатает в StringGrid, один обновляет ProgressBar, а третий устанавливает переменную op, которая используется подпрограммой StringGrid Sync, и я не вижу, чтобы этот код имел отношение к проблеме, однако я могу отправить сообщение по запросу.
's/divress/ramble on непрестанно /' :-) – paxdiablo
После прочтения документации для 'TThread.Terminate', где говорится:« Terminate устанавливает для свойства Terminated потока значение true, сигнализируя, что поток должен быть прерван как можно скорее насколько это возможно ", почему вы продолжаете задаваться вопросом, что он делает? Кроме того, помните, что у вас есть исходный код. Если вы хотите знать, что он делает, откройте * Classes.pas * и посмотрите. –
Те вызовы Synchronize могут быть невероятно дорогостоящими. Почему бы вам просто не записать информацию в целое число, убедитесь, что она выровнена на границе 4 байта, и получите ваш основной поток, чтобы периодически его читать по таймеру и обновлять интерфейс таким образом. Вы потеряете все преимущества потоковой передачи, если потратите время на синхронизацию потоков! –