私はgabr'sOmniThreadLibraryを使って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 // [..]
、すべてが素晴らしい作品。 1,000個のURLを実行すると、アプリケーションのメモリ使用量が10 MBから130 MBに増加します。それは大きな問題ではないと私はそれを理解しています。
しかし、問題は、「開始」をクリックするたびに、アプリのメモリ使用量が約130MB増加することです。たぶん私は何をやっているのかわからないかもしれませんが、私はスレッドプールを使用すると、実行するたびに新しいスレッドを作成する必要はないという印象を受けました。
私が望むことは、以前に作成されたプール内のスレッドは、その後の実行で再利用されることです。私は、「開始」を1回クリックしても10回をクリックしても、アプリのメモリ使用量は約130MBに留まると予想していました。
提案がありますか?
よろしく
この問題は決して解決しませんでした。私はTThreadを使用してロジックを追加し、一度に16スレッド以上のスレッドが実行されないようにしました。私のメモリ使用量は20MBを超えることはありませんでした。毎回〜130mbの増加と比較して、私はOTLで走った。問題は私の目的だと確信していますが、Eureka LogはOTLのコードでエンドポイントの通信作成にメモリリークを示しました。本当の問題がどこにあるのかは分かりませんが、TThreadは美しく働いています。 – Mick