Russian Qt Forum
Ноябрь 24, 2024, 14:50 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QThread, проблема с количеством потоков.  (Прочитано 7423 раз)
PaulKaz
Гость
« : Март 29, 2012, 14:22 »

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

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

В приложении программа которая раз в 10мс создаёт поток. Дойдя где-то 1000 начитают сыпаться ошибки.
« Последнее редактирование: Март 29, 2012, 15:54 от PaulKaz » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Март 29, 2012, 14:26 »

Сам с таким столкнулся недавно. Не создавай столько потоков.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Bepec
Гость
« Ответ #2 : Март 29, 2012, 14:27 »

Вы хохо не хуху?

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


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

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

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

update: 1000 потоков, убитых терминейтедом... Это ужасно...
« Последнее редактирование: Март 29, 2012, 14:29 от Bepec » Записан
V1KT0P
Гость
« Ответ #3 : Март 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 гигабайт, не считая переменных которые используют потоки.
Записан
Bepec
Гость
« Ответ #4 : Март 29, 2012, 14:31 »

Не, есть цикл статей по Qt на Хабрахабре.

Там приводятся факты об управлении потоками в Windows и Linux. И насколько я помню, Windows имеет ограничение, а Linux позволяет творить что угодно.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #5 : Март 29, 2012, 14:33 »

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

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
V1KT0P
Гость
« Ответ #6 : Март 29, 2012, 14:39 »

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

У меня максимум количества потоков в программе было - 4. И то для беспрерывного запроса данных с частотой раз в секунду. И вроде хватало.

НАФИГА 10000 потоков?Непонимающий??
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Март 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
Записан
PaulKaz
Гость
« Ответ #9 : Март 29, 2012, 15:48 »


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

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


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

Спасибо за помощь.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.202 секунд. Запросов: 23.