Как контролировать количество запущенных Thread ?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Как контролировать количество запущенных Thread ?

Сообщение and_rivne » 22.08.2018 12:04:33

Порекомендуйте решение, чтобы держать количество потоков под контролем.
В главном модуле программы, при потребности, создаю поток, который должен отработать и сам "умереть" (схема работает):
Код: Выделить всё
InetThrd := TThread.Create();
InetThrd.Start;

Но в какой то момент натыкаюсь на ошибку "не достаточно памяти" при создании нового потока.
Хочу ограничить количество, например 5, а все остальные потоки пусть ждут.

Из решений нашел только два:
1. Самому контролировать количество запущенных потоков и организовать очередь (как-то влом изобретать велосипед)
2. Использовать ProcThreadPool.DoParallel из http://wiki.freepascal.org/Parallel_procedures (не уверен что это то что мне нужно)
and_rivne
новенький
 
Сообщения: 11
Зарегистрирован: 09.12.2011 13:40:42

Re: Как контролировать количество запущенных Thread ?

Сообщение olegy123 » 22.08.2018 12:14:23

and_rivne писал(а):Но в какой то момент натыкаюсь на ошибку "не достаточно памяти" при создании нового потока.
что там с памятью делаете что заканчивается?

and_rivne писал(а):Хочу ограничить количество, например 5, а все остальные потоки пусть ждут.
вам нужен семафор.
olegy123
энтузиаст
 
Сообщения: 979
Зарегистрирован: 25.02.2016 12:10:20

Re: Как контролировать количество запущенных Thread ?

Сообщение and_rivne » 22.08.2018 12:20:26

что там с памятью делаете что заканчивается?

Судя по документации, там что не делай, но количество одновременно запущенных потоков ограничено. У меня затыкается, приблизительно, на 120 штук.

вам нужен семафор.

Есть готовые решения от лазаруса?
and_rivne
новенький
 
Сообщения: 11
Зарегистрирован: 09.12.2011 13:40:42

Re: Как контролировать количество запущенных Thread ?

Сообщение serbod » 22.08.2018 14:44:24

Примерно так, это общая идея, а развить можно по-своему:

Код: Выделить всё
var GlobalThreadCount: Integer;

procedure TThread.AfterConstruction();
begin
  inherited;
  Inc(GlobalThreadCount);
end;

procedure TThread.BeforeDestruction();
begin
  Dec(GlobalThreadCount);
  inherited;
end;

Аватара пользователя
serbod
постоялец
 
Сообщения: 310
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Как контролировать количество запущенных Thread ?

Сообщение olegy123 » 23.08.2018 15:41:43

and_rivne писал(а):Есть готовые решения от лазаруса?

есть документация
http://prog-example.ru/mnogopotochnost.html

and_rivne писал(а):. У меня затыкается, приблизительно, на 120 штук.
у меня было больше 20000, полет был нормальный.
olegy123
энтузиаст
 
Сообщения: 979
Зарегистрирован: 25.02.2016 12:10:20

Re: Как контролировать количество запущенных Thread ?

Сообщение Ichthyander » 23.08.2018 22:16:36

and_rivne писал(а):Судя по документации, там что не делай, но количество одновременно запущенных потоков ограничено. У меня затыкается, приблизительно, на 120 штук.

У меня было также. Больше 120 штук не создавалось. Как я решил, на основании https://bugs.freepascal.org/view.php?id=17755
Уже не помню точно, но проблему решил установкой ключа -Cs (Stack Size в свойствах проекта). После этого потоков и по 1000 и больше создается.
Теперь важный момент: в последних версиях Lazarus у меня все работает и без установки этого ключа. Хотя вот мне пришло в голову сейчас: может дело было в битности системы или версии ОС Виндоус?
Аватара пользователя
Ichthyander
постоялец
 
Сообщения: 418
Зарегистрирован: 04.04.2007 08:32:43
Откуда: Астрахань

Re: Как контролировать количество запущенных Thread ?

Сообщение olegy123 » 24.08.2018 04:10:40

Ichthyander писал(а):Хотя вот мне пришло в голову сейчас: может дело было в битности системы или версии ОС Виндоус?
да там есть ограничения, но обычному пользователю их нереально достичь - размерность там в 32битах в x86 и 64бита в x86_64. В линухе сетевые параметры подходят для 100мб/с, с 1Gb/s нужно их подкручивать.

Иначе всякие торрент-качалки, игры, сайты, инженерные задачи испытывали трудности.
У автора темы скорее либо задача неправильно оформлена, либо просто протечка памяти сразу образовала залив.
olegy123
энтузиаст
 
Сообщения: 979
Зарегистрирован: 25.02.2016 12:10:20


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Alex2013, Yandex [Bot] и гости: 2

Рейтинг@Mail.ru