Russian Qt Forum

Qt => Вопросы новичков => Тема начата: PaulKaz от Март 29, 2012, 14:22



Название: QThread, проблема с количеством потоков.
Отправлено: PaulKaz от Март 29, 2012, 14:22
Есть программа, в которой раз в 5-10 секунд создаётся 3-4 потока, выполняется необходимое задание и потоки завершаются. Через какое-то время использования обнаружилось что создаётся не больше 900...1100 потоков (при создании последующего вылетает ошибка QThread::start: Failed to create thread (??? ??????? ???????.)).

При этом проблема только появляется в WindowsXP
Qt4.8.0

В приложении программа которая раз в 10мс создаёт поток. Дойдя где-то 1000 начитают сыпаться ошибки.


Название: Re: QThread, проблема с количеством потоков.
Отправлено: Пантер от Март 29, 2012, 14:26
Сам с таким столкнулся недавно. Не создавай столько потоков.


Название: Re: QThread, проблема с количеством потоков.
Отправлено: Bepec от Март 29, 2012, 14:27
Вы хохо не хуху?

На**га вам одновременно 10к потоков???
Или вы решили взламывать пентагон подбором пароля?


Конечно. Windows следит за количеством потоком и не отдаст вам больше положенного.

Это же не linux, где, насколько я помню, можно до 100к потоков запустить с наивысшим приоритетом.

PS удалять потоки не забывайте... Так, ради разнообразия.

update: 1000 потоков, убитых терминейтедом... Это ужасно...


Название: Re: QThread, проблема с количеством потоков.
Отправлено: V1KT0P от Март 29, 2012, 14:28
Есть программа, в которой раз в 5-10 секунд создаётся 3-4 потока, выполняется необходимое задание и потоки завершаются. Через какое-то время использования обнаружилось что создаётся не больше 900...1100 потоков (при создании последующего вылетает ошибка QThread::start: Failed to create thread (??? ??????? ???????.)).

При этом проблема только появляется в WindowsXP
Qt4.8.0

В приложении программа которая раз в 10мс создаёт поток. Дойдя где-то 1000 начитают сыпаться ошибки.
Может памяти не хватает, ведь на один поток 1 метр по умолчанию выделяется. 1000 потоков уже 1 гигабайт, не считая переменных которые используют потоки.


Название: Re: QThread, проблема с количеством потоков.
Отправлено: Bepec от Март 29, 2012, 14:31
Не, есть цикл статей по Qt на Хабрахабре.

Там приводятся факты об управлении потоками в Windows и Linux. И насколько я помню, Windows имеет ограничение, а Linux позволяет творить что угодно.


Название: Re: QThread, проблема с количеством потоков.
Отправлено: m_ax от Март 29, 2012, 14:33
А это нормально вызывать terminate() в run() ?
Код
C++ (Qt)
void MyThread::run()
{
   printf("Start thread! %d\n",threadID);
   terminate();
}
 
И потом объекты MyThread никто не удаляет..


Название: Re: QThread, проблема с количеством потоков.
Отправлено: V1KT0P от Март 29, 2012, 14:39
В приложении программа которая раз в 10мс создаёт поток. Дойдя где-то 1000 начитают сыпаться ошибки.
Вот фикс(но учти если задачи будут выполняться слишком долго, а потоки будут появляться слишком быстро, то программа упадет. Лучше всего контролировать количество потоков):
Код
C++ (Qt)
MyThread::~MyThread()
{
   quit();
   wait();
}
 
void MyThread::run()
{
   printf("Start thread! %d\n",threadID);
   this->deleteLater();
}
 


Название: Re: QThread, проблема с количеством потоков.
Отправлено: Bepec от Март 29, 2012, 14:42
У меня максимум количества потоков в программе было - 4. И то для беспрерывного запроса данных с частотой раз в секунду. И вроде хватало.

НАФИГА 10000 потоков??????


Название: Re: QThread, проблема с количеством потоков.
Отправлено: Igors от Март 29, 2012, 14:57
НАФИГА 10000 потоков??????
Видимо из эстетических соображений "больше = лучше"

Код
C++ (Qt)
MyThread::~MyThread()
{
   quit();
   wait();
}
 
void MyThread::run()
{
   printf("Start thread! %d\n",threadID);
   this->deleteLater();
}
 
Работать будет, но зачем задействовать потенциально опасное deleteLater и потом ломать голову "а есть ли EventLoop"? Проще подсесть на удобный сигнал finished и в нем по-простому сделать delete


Название: Re: QThread, проблема с количеством потоков.
Отправлено: PaulKaz от Март 29, 2012, 15:48

На**га вам одновременно 10к потоков???
Или вы решили взламывать пентагон подбором пароля?

Конечно. Windows следит за количеством потоком и не отдаст вам больше положенного.


Собственно 1000 потоков одновременно и не работают. Одновременно 1-2, максимум до 4. Проблема собственно и была в том, что завершал их teminate'ом.
Исправил, всё нормально заработало.

Спасибо за помощь.