gpt4 book ai didi

multithreading - 如何让主(调用)线程等待子线程完成执行?

转载 作者:行者123 更新时间:2023-12-03 15:24:53 25 4
gpt4 key购买 nike

使用:Delphi 10 Seattle,Win32 VCL 表单应用程序

我正在开发一款更新程序应用程序,用于检查一个或多个已安装软件应用程序的更新,并在发现更新时按顺序下载更新。下载每个更新后,它将安装该更新,然后再继续下载下一个更新。下载位作为线程类(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;

我的具体问题是:如何让主(调用)UI 线程等待下载线程完成,然后再创建新的下载线程以开始下一次下载?

我相信需要某种形式的排队,但不确定如何实现它。非常感谢您的提示和建议。

最佳答案

如果我理解正确的话,您有一个要下载和安装的 URL 列表(通过之前执行更新检查获得)。您想要从这些 URL 下载更新并一一安装:下载更新 1、安装更新 1、下载更新 2、安装更新 2 等。

这是一个可能的设计:

在您的 WebFileDownloaderThread_TermulatedMethod 中,开始安装刚刚下载的更新(为了保持主线程响应,请在单独的线程中执行此操作)。

在安装程序线程的 OnTerminate 处理程序中,删除刚刚完成的 URL(或将其标记为已处理),并通过再次调用 DownloadUpdateFromWeb 开始下载下一个 URL,除非列表已经为空(或不再包含未处理的项目)。

(顺便说一句,方法 DownloadUpdateFromWeb 最好命名为 BeginDownloadUpdateFromWeb,以表明其异步性质。)

关于multithreading - 如何让主(调用)线程等待子线程完成执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34650365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com