1

私は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にとどまると予想していました。

助言がありますか?

よろしく

4

2 に答える 2

2

これはスレッドの問題ですか、それともメモリ リークの問題ですか? デバッガーの [スレッド ステータス] ウィンドウを使用して、割り当てられたスレッドの数が実際に増加しているかどうかを確認してください。そうでない場合は、スレッド内にオブジェクトを作成し、それらを解放していない可能性があります。

于 2009-08-07T23:54:10.360 に答える
1

スレッドの問題というよりもメモリリークの問題のように見えます...

于 2009-08-08T00:47:05.043 に答える