Создание потока (TThread)

Общие вопросы: версии и диалекты, синтаксис языка, cтруктуры и типы данных (массивы, строки, списки...), обработка данных и т.д.
Ответить
Shouldercannon
Сообщения: 74
Зарегистрирован: 08 июн 2008, 15:49

15 дек 2011, 18:36

От теории к практике. Вот, что получилось сделать. Возможно, допущены ошибки.

Код: Выделить всё

  TNewThread = class(TThread)
  private
	{ Private declarations }
	s: string;
	Bool: Boolean;
  protected
	procedure SyncProc;
	procedure Execute; override;
	procedure DoTerminate; override;
  end;

var
  Form1: TForm1;
  a: string;
  DownloadStatus: Boolean;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  NewThread: TNewThread;
begin
  Button1.Enabled := False;

  NewThread := TNewThread.Create(True); // Поток создан и остановлен
  NewThread.FreeOnTerminate := True; // Уничтожить поток после завершения работы
  NewThread.Resume; // Запуск потока
end;

procedure TNewThread.Execute;
var
  HTTP: TIdHTTP;
  MS: TMemoryStream;
begin
  Bool := True; // Статус выполнения операции (успешно)

  HTTP := TIdHTTP.Create(nil);
  MS := TMemoryStream.Create;
  try
	try
	  HTTP.Get('http://rvs.ucoz.ru/files/programs/il2sfbc_update.7z', MS);
	  MS.SaveToFile('il2sfbc_update.7z');
	except
	  on E: Exception do
	  begin
		Bool := False; // Статус выполнения операции (накрылось медным тазом)
		s := E.Message;
	  end; 
	end;
  finally
	HTTP.Free;
	MS.Free;
  end;

  Synchronize(SyncProc); // Синхронизация с основным потоком
end;

procedure TNewThread.SyncProc;
begin
  DownloadStatus := Bool; // Синхронизация Boolean
  a := s; // Синхронизация string
end;

procedure TNewThread.DoTerminate;
begin
  // Что-то... Если нужно до вызова внешнего OnTerminate (если назначен)
  inherited;
  // Что-то... Если нужно после вызова внешнего OnTerminate (если назначен)
  Form1.Button1.Enabled := True;
  if DownloadStatus then MessageBox(0, 'Скачивание прошло успешно', 'Информация', MB_ICONInformation) else MessageBox(0, PChar('Произошла ошибка при скачивании. ' + a), 'Ошибка', MB_ICONError) 
end;
Верно?
Ответить