インターネットからファイルをダウンロードする Delphi アプリケーションを作成しています。サーバーが範囲要求をサポートしている場合、マルチスレッドになります。進行状況も GUI に中継されます。
現在のソフトウェア モデルはTThread
コンポーネントを使用しています。GUI は を呼び出し、TDownloadThread
次に を生成しTDownloadPartThreads
ます。これらは、'WinHttp' を介して実際にダウンロードを行うスレッドです。
私の問題:4つのスレッドしかダウンロードしていない1つのダウンロードでも、CPUが使い果たされます。
私の想定される原因:
- 宛先ファイルに 8192 バイトごとに書き込みを行っていますが、1 つのブロックに書き込む前にバッファリングする必要があるかどうか疑問に思っていました。
- スレッド通信は
Synchronize(MainForm.UpdateProgress(Downloaded, TotalSize))
、私が聞いた中で行われるのはひどいものです。おそらく、スレッド間でオブジェクトを共有して、メインフォームのタイマーを使用してこれにアクセスし、進行状況を更新できるようにする必要がありますか?
私のソリューション
ファイルの書き込みをずらして、すべての
x
バイトのみを書き込みます。TThread
使用するコンポーネントを更新し、OmniThreadLibrary
何らかの形でデータをメイン フォームに送り返します。その後、各TDownloadPart
スレッドは になりIOmniWorker
、オブジェクトをメイン フォームと共有することで進行状況を送り返します。次に、メイン フォームはタイマーを使用して、次のように進行状況を更新します。ProgressBar1.Position := sharedDataObject.Progress;
うまくいけば、誰かが私を正しい方向に向けることができます!