• 🚨 29 мая стартует курс «Пентест Active Directory: от теории к практике» от Академии Кодебай

    🔍 Изучите реальные техники атак на инфраструктуру Active Directory: от первоначального доступа до полной компрометации.
    🛠️ Освойте инструменты, такие как BloodHound, Mimikatz, CrackMapExec и другие.
    🧪 Пройдите практические лабораторные работы, имитирующие реальные сценарии атак.
    🧠 Получите знания, которые помогут вам стать востребованным специалистом в области информационной безопасности.

    После старта курса запись открыта еще 10 дней Подробнее о курсе ...

  • Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

Завершить Работу Потока При Закрытии Формы

  • Автор темы Автор темы Shouldercannon
  • Дата начала Дата начала
S

Shouldercannon

Код:
procedure TForm1.BStartClick(Sender: TObject);
begin
ProgressBar1.Max := SLRepairFiles.Count;

DownLoader_Thread := TDownLoader_Thread.Create(True);
DownLoader_Thread.FSLRepairFiles := SLRepairFiles;
DownLoader_Thread.FreeOnTerminate := True;
DownLoader_Thread.Resume;
end;

procedure TDownLoader_Thread.Execute;
var
HTTP: TIdHTTP;
FS: TFileStream;
i: Integer;
Folder: string;
begin
HTTP := TIdHTTP.Create(nil);

CriticalSection.Enter;

for i := 0 to FSLRepairFiles.Count - 1 do
begin
if Self.Terminated then Break; // Если главный поток приказал - умираем

Folder := ExtractFilePath(Application.ExeName) + ExtractFilePath(FSLRepairFiles.Strings[i]);
ForceDirectories(Folder);
try
try
FS := TFileStream.Create(Folder + ExtractFileName(FSLRepairFiles.Strings[i]), fmCreate);
HTTP.Get('http://77.108.194.247/' + FSLRepairFiles.Strings[i], FS);
except
end;
finally
FS.Free;
end;

Progress := i + 1;

Synchronize(SyncProc);
end;

CriticalSection.Leave;

HTTP.Free;
end;

procedure TDownLoader_Thread.SyncProc;
begin
Form1.ProgressBar1.Position := Progress;
if FSLRepairFiles.Count = Progress then Form1.Caption := 'Восстановлено: ' + IntToStr(FSLRepairFiles.Count) + ' файлов';
end;

procedure TForm1.BStopClick(Sender: TObject);
begin
DownLoader_Thread.Terminate;
DownLoader_Thread.WaitFor; // Ждём, когда DownLoader_Thread "мирно" помрёт
DownLoader_Thread.Free;
end;
Где моя ошибка?
 

Вложения

  • Error.gif
    Error.gif
    7,9 КБ · Просмотры: 598
Код:
procedure TForm1.BStartClick(Sender: TObject);
begin
ProgressBar1.Max := SLRepairFiles.Count;

DownLoader_Thread := TDownLoader_Thread.Create(True);
DownLoader_Thread.FSLRepairFiles := SLRepairFiles;
DownLoader_Thread.FreeOnTerminate := True;
DownLoader_Thread.Resume;
end;
...
procedure TForm1.BStopClick(Sender: TObject);
begin
DownLoader_Thread.Terminate;
DownLoader_Thread.WaitFor; // Ждём, когда DownLoader_Thread "мирно" помрёт
DownLoader_Thread.Free;
end;
Где моя ошибка?

Как это где? В коде :)
Вот:
Код:
DownLoader_Thread.Free;
Он же уже умер...
Вы ж сами ему сказали при создании:
Код:
DownLoader_Thread.FreeOnTerminate := True;
Это значит: "Самостоятельно умереть после терминирования"
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!

Курс AD