我正在创建一个 Delphi 应用程序来从 Internet 下载文件,如果服务器支持范围请求,它将是多线程的。进度也会传递回 GUI。
当前的软件模型使用TThread
组件。GUI 调用 aTDownloadThread
然后生成TDownloadPartThreads
- 这些是实际通过“WinHttp”进行下载的线程。
我的问题:CPU 已经用完了,即使是一次下载,只有 4 个线程下载。
我推测的原因:
- 我每 8192 字节写入目标文件,想知道是否应该在写入一个块之前对其进行缓冲?
- 线程通信是通过
Synchronize(MainForm.UpdateProgress(Downloaded, TotalSize))
我听说的 AWFUL 来完成的,也许我应该在线程之间共享一个对象,这样我就可以使用主窗体上的计时器来访问它,以更新进度?
我的解决方案
错开文件写入,只写入每个
x
字节。更新
TThread
要使用的组件OmniThreadLibrary
并将数据以某种方式发送回主窗体。然后每个TDownloadPart
线程将成为一个IOmniWorker
并通过与主窗体共享一个对象来发回其进度。然后主窗体将使用计时器来更新其进度,例如:ProgressBar1.Position := sharedDataObject.Progress;
希望有人能指出我正确的方向!