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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Удаление объекта после завершения потока  (Прочитано 3585 раз)
uncleslava
Гость
« : Октябрь 18, 2012, 14:38 »

Здравствуйте.
Делаю многопоточный сервер. За основу взял Threaded Fortune Server Example. Добавил ограничение на количество потоков.
Код:
    qServerThread *thread = new qServerThread(socketDescriptor, commonData, this);
    connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); //NOTE: no need to delete the object
    thread->start();
    //Если достигли максимального количества потоков ждём пока кто то освободится
    while(thread->threadCount() >= maxThreads)
    {
           QTest::qSleep(10);
    }
При невысокой нагрузке на сервер всё работает замечательно. Если же нагрузка постоянно в предельном состоянии. Удаление объектов qServerThread не происходит до тех пор пока нагрузка не снизится. То есть поток отрабатывает, а слот deleteLater не вызывается. В результате имею постоянное количество запущенных потоков (maxThreads) и непрерывно растущее количество объектов qServerThread  в памяти.
Предпологаю, что ждать освобождения потоков таким образом:
Код:
QTest::qSleep(10); 
не правильно. Здесь логично было бы передать управление механизму обработки сигналов Qt. Но как это сделать не понятно.
Может кто нибудь подскажет решение.
Записан
mutineer
Гость
« Ответ #1 : Октябрь 18, 2012, 15:10 »

QApplication::processEvents
Записан
uncleslava
Гость
« Ответ #2 : Октябрь 18, 2012, 15:50 »

QApplication::processEvents
Спасибо за подсказку, но теперь вылетает на QEventTransition.
В пирчине пока не уверен. По сути получается QApplication::processEvents вызывается при каждом подключении к серверу и возможно "зацикливается" при наличии ожидающих в очереди.
Записан
mutineer
Гость
« Ответ #3 : Октябрь 18, 2012, 16:08 »

Возможно что и зацикливается, неизвестно ведь где у тебя этот код выполняется
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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