【问题标题】:How do I control memory usage with Omni Thread Library's thread pool?如何使用 Omni Thread Library 的线程池控制内存使用?
【发布时间】:2010-11-17 19:19:18
【问题描述】:

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

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

在演示应用程序“app_11_ThreadPool.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。也许我只是不知道自己在做什么,但我的印象是使用线程池意味着我不必每次运行都创建 new 线程。

我希望池中先前创建的线程将在后续执行中重用。我希望无论我点击“开始”1 次还是随后点击 10 次,我的应用程序的内存使用量都将保持在 ~130 mb 左右。

有什么建议吗?

问候

【问题讨论】:

  • 我从来没有解决过这个问题。我转而使用 TThread 并添加逻辑以确保一次运行的线程不超过 16 个。我的内存使用量从未超过 20mb。与我每次使用 OTL 运行时增加约 130mb 相比。我确定问题出在我的最后,但 Eureka Log 显示 OTL 代码中端点通信创建中存在内存泄漏。我不确定真正的问题出在哪里,但 TThread 运行良好。

标签: delphi multithreading threadpool


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的建议,我不知道线程状态窗口....这是我第一次在应用程序中使用超过 2 个线程,所以这是一个一点学习经验。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2011-07-25
    • 2015-03-28
    • 1970-01-01
    相关资源
    最近更新 更多