Как контролировать использование памяти с помощью пула потоков Omni Thread Library? - PullRequest
1 голос
/ 07 августа 2009

Я использовал gabr OmniThreadLibrary для создания ThreadPool.

Я новичок, когда дело доходит до многопоточности, поэтому я нашел OTL таким интересным.

Следуя демонстрационному приложению app_11_ThreadPool.exe, я настроил пул потоков в своем приложении. Цель моего приложения - взять список URL-адресов, попытаться подключиться к ним и загрузить любой файл, который автоматически возвращается (я проверяю потенциальные вредоносные сайты на полезные нагрузки, чтобы заблокировать их).

Обычно у меня будет список из 500 - 1000 сайтов. У меня есть TMemo, который содержит URL-адреса в моей основной форме. Вот мой соответствующий код. Обратите внимание, что этот код выполняется из моего события нажатия кнопки «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 МБ до ~ 130 МБ. Это не имеет большого значения, и я это понимаю.

Но проблема в том, что каждый раз, когда я нажимаю «Начать», использование памяти приложением увеличивается на ~ 130 МБ. Может быть, я просто не знаю, что я делаю, но у меня сложилось впечатление, что использование пула потоков означало бы, что мне не придется создавать новые потоки при каждом запуске.

Я надеюсь, что ранее созданные потоки в пуле будут повторно использоваться при последующих выполнениях. Я ожидал, что использование памяти моим приложением останется на уровне ~ 130 Мб, независимо от того, нажму ли я кнопку «начать» 1 раз или 10 раз подряд.

Есть предложения?

Привет

Ответы [ 2 ]

2 голосов
/ 08 августа 2009

Это проблема многопоточности или утечки памяти? Попробуйте использовать окно статуса потоков отладчика, чтобы определить, действительно ли увеличивается количество выделенных потоков. Если нет, то вы, вероятно, создаете объекты внутри потоков и не освобождаете их.

1 голос
/ 08 августа 2009

Больше похоже на проблему утечки памяти, чем на многопоточность ...

...