Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Завершить работу потока при закрытии формы  (Прочитано 9162 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Shouldercannon
Помогающий

ru
Offline Offline

« : 07-05-2012 10:19 » 

Код: (Delphi)
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 (7.94 Кб - загружено 892 раз.)
Записан
v2
Помогающий

ua
Offline Offline

« Ответ #1 : 07-05-2012 15:05 » new

>DownLoader_Thread.FreeOnTerminate := True; 
..
>DownLoader_Thread.Free;
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines