Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: uncleslava от Октябрь 18, 2012, 14:38



Название: Удаление объекта после завершения потока
Отправлено: 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. Но как это сделать не понятно.
Может кто нибудь подскажет решение.


Название: Re: Удаление объекта после завершения потока
Отправлено: mutineer от Октябрь 18, 2012, 15:10
QApplication::processEvents


Название: Re: Удаление объекта после завершения потока
Отправлено: uncleslava от Октябрь 18, 2012, 15:50
QApplication::processEvents
Спасибо за подсказку, но теперь вылетает на QEventTransition.
В пирчине пока не уверен. По сути получается QApplication::processEvents вызывается при каждом подключении к серверу и возможно "зацикливается" при наличии ожидающих в очереди.


Название: Re: Удаление объекта после завершения потока
Отправлено: mutineer от Октябрь 18, 2012, 16:08
Возможно что и зацикливается, неизвестно ведь где у тебя этот код выполняется