Использование: Delphi 10 Seattle, Win32 VCL forms applicationКак заставить основной (вызывающий) поток ждать завершения дочернего потока?
Я разрабатываю приложение для обновления, которое проверяет наличие обновлений для одного или нескольких установленных программных приложений, а также при обнаружении обновлений загружает обновления в последовательности. После того как каждое обновление будет загружено, оно установит обновление, прежде чем приступать к загрузке следующего обновления. Загрузки бит реализован в виде потока класса (потомка TThread) и его конструктор следующим образом:
constructor TWebFileDownloaderThread.Create(CreateSuspended: Boolean; const AWebFileURL, ALocalFilePath: String;
ACallBackProc: TProgressCallback; AProxySetting: TProxySetting);
begin
inherited Create(CreateSuspended);
FWorkResult := False;
FWebFileURL := AWebFileURL;
FProxySetting := AProxySetting;
FLocalFilePath := ALocalFilePath;
FUpdateCallbackProc := ACallBackProc;
end;
Основной поток создает и запускает загрузчик нить следующим образом:
procedure TfmMain.DownloadUpdateFromWeb(const AInstallerFileURL: String);
var
internet_file_download_thread: TWebFileDownloaderThread;
begin
internet_file_download_thread := TWebFileDownloaderThread.Create(True, AInstallerFileURL, FUpdateDownloadDir,
UpdateProgressCallback, FProxySetting);
internet_file_download_thread.OnTerminate := WebFileDownloaderThread_TerminatedMethod;
internet_file_download_thread.FreeOnTerminate := True;
internet_file_download_thread.Start;
end;
Мой конкретный вопрос : Как сделать основной (вызывающий) поток пользовательского интерфейса до тех пор, пока поток загрузчика не завершится, перед созданием нового потока загрузчика, чтобы начать следующую загрузку?
Я считаю, что требуется некоторая форма очереди, но не знаете, как ее реализовать. Ваши советы и советы очень ценятся.
Вы должны попробовать так сложно, как можно избежать этой конструкции. Завершение * непосредственно * должно запускать следующее задание без потока, который должен дождаться завершения, чтобы запустить следующее задание. –
@DavidSchwartz не должен быть нитями как независимыми от «внешнего мира», насколько это возможно? Triggering другой поток для загрузки, кажется, не несет ответственности за поток загрузки для меня – mjn
@mjn Это совершенно неправильный способ подумать об этом. Нити - это только те транспортные средства, которые управляют кодом. Это код, который несет ответственность, а не потоки. Независимо от того, какой код загружает, вы должны продолжать делать то, что нужно сделать после загрузки, не требуя нить, чтобы сидеть в ожидании. Нет смысла создавать поток для выполнения работы, а затем ждать завершения этого потока - этот дополнительный поток не имеет никакой цели. –