私はgabr の OmniThreadLibraryを使用して ThreadPool を構築しています。
私はマルチスレッドに関しては初心者なので、OTL が非常に興味深いと感じたのはそのためです。
デモ アプリケーション「app_11_ThreadPool.exe」に従って、アプリケーションにスレッド プールをセットアップします。私のアプリの目的は、URL のリストを取得し、それらに接続して、自動的に返されるファイルをダウンロードしようとすることです (ブロックできるように、潜在的なマルウェア サイトのペイロードをテストしています)。
通常、500 ~ 1000 のサイトのリストがあります。メイン フォームに URL を保持する TMemo があります。ここに私の関連コードがあります。このコードは、「Begin」ボタンのクリック イベントから実行されることに注意してください。
iNumTasks := memoSiteList.Lines.Count - 1;
GlobalOmniThreadPool.MaxQueued := 16;
GlobalOmniThreadPool.MonitorWith(OmniEventMonitor1);
GlobalOmniThreadPool.MaxExecuting := 16;
GlobalOmniThreadPool.MaxQueued := 0;
for iTask := 1 to iNumTasks + 1 do
begin
if iTask mod 4 = 0 then
Application.ProcessMessages;
CreateTask(
TSiteQuery.Create(
url,
full_url,
sProxyServer,
sProxyPort,
sSaveLocation,
bVerboseHeaders)
).MonitorWith(OmniEventMonitor1).Schedule;
end;
TSiteQuery は次のとおりです。
type
TSiteQuery = class(TOmniWorker)
strict private
{ Private declarations }
FTaskID: int64;
furl: string;
f_full_url: string;
fsProxyServer: string;
fsProxyPort: string;
fbVerboseHeaders: boolean;
fsSaveLocation: string;
private // [..]
現在、すべてがうまく機能しています。1000 個の URL を実行すると、アプリケーションのメモリ使用量が 10 MB から最大 130 MB に増加します。それは大したことではなく、私はそれを理解しています。
しかし、問題は、「開始」をクリックするたびに、アプリのメモリ使用量が最大 130 MB 増加することです。何をしているのかわからないだけかもしれませんが、スレッドプールを使用すると、実行のたびに新しいスレッドを作成する必要がないという印象を受けました。
プール内で以前に作成されたスレッドが後続の実行で再利用されることを願っています。「開始」を1回クリックしても、その後10回クリックしても、アプリのメモリ使用量は約130 mbにとどまると予想していました。
助言がありますか?
よろしく