代码之家  ›  专栏  ›  技术社区  ›  Mick

如何使用Omni线程库的线程池控制内存使用?

  •  1
  • Mick  · 技术社区  · 16 年前

    我一直在使用 gabr's OmniThreadLibrary 创建线程池。

    说到多线程,我是个新手,这就是为什么我发现OTL如此有趣的原因。

    在演示应用程序“app_11_thread pool.exe”之后,我在应用程序中设置了一个线程池。我的应用程序的目的是获取一个URL列表,并尝试连接到它们并下载任何自动返回的文件(我正在测试潜在恶意软件站点的有效负载,以便阻止它们)。

    通常我会列出500到1000个站点。我有一个tmemo,它在我的主窗体上保存URL。这是我的相关代码。请注意,此代码是从我的“开始”按钮单击事件执行的。

      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会将我的应用程序的内存使用从10MB增加到130MB。这没什么大不了的,我明白。

    但问题是,每次我单击“开始”,应用程序的内存使用量就会增加大约130MB。也许我只是不知道自己在做什么,但我觉得使用线程池意味着我不必创建 新的 每次运行都要线程。

    我希望之前在池中创建的线程可以在后续执行中重用。我希望我的应用程序的内存使用量将保持在大约130 MB左右,无论我单击“开始”1次还是随后的10次。

    有什么建议吗?

    当做

    2 回复  |  直到 16 年前
        1
  •  2
  •   Mason Wheeler    16 年前

    这是线程问题还是内存泄漏问题?尝试使用调试器的“线程状态”窗口来确定分配的线程数是否在实际增加。如果没有,那么您可能正在线程内创建对象,而不是释放它们。

        2
  •  1
  •   Fabricio Araujo    16 年前

    看起来更像是内存泄漏问题而不是线程问题…