Я использовал 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 раз подряд.
Есть предложения?
Привет