Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: blood_shadow от Апрель 29, 2011, 16:31



Название: завершение потока
Отправлено: blood_shadow от Апрель 29, 2011, 16:31
есть поток Pop3ConnectionThread, ф-ция run потока:

Код
C++ (Qt)
void Pop3ConnectionThread::run()
{
   Pop3ConnectionObject pop3Object;
 
   connect(this, SIGNAL(threadStop()), &pop3Object, SLOT(stopExecution()));
 
   emit threadReady();
 
   exec();
   qDebug() << "After exec..";
}
 

и ф-ция которая останавливает поток и слот объекта pop3Object:
Код
C++ (Qt)
void Pop3ConnectionThread::stop()
{
   quit();
   emit threadStop();
}
 

сигнал threadStop() останавливает слот:
Код
C++ (Qt)
void Pop3ConnectionObject::stopExecution()
{
   stopped = true;
   qDebug() << "In Slot";
}
 

Вывод в консоль -
Код:
In Slot
After exec..

Получается exec(); завершается только когда обработает текущее событие?


Название: Re: завершение потока
Отправлено: Igors от Апрель 29, 2011, 18:15
Получается exec(); завершается только когда обработает текущее событие?
exec завершается когда из очереди eventLoop извлечено событие quit. То есть текущее событие точно будет допилено до конца, а может и другие что стоят в очереди перед quit.

Выйти посылая сигнал не удается если нитка ждет на мутексе или семафоре, как впрочем и с помощью флажка stopped.


Название: Re: завершение потока
Отправлено: blood_shadow от Апрель 29, 2011, 18:51
Получается exec(); завершается только когда обработает текущее событие?
exec завершается когда из очереди eventLoop извлечено событие quit. То есть текущее событие точно будет допилено до конца, а может и другие что стоят в очереди перед quit.

Выйти посылая сигнал не удается если нитка ждет на мутексе или семафоре, как впрочем и с помощью флажка stopped.
а если в текущем событии вызывается processEvent()  выход произойдет?


Название: Re: завершение потока
Отправлено: Igors от Апрель 29, 2011, 19:30
а если в текущем событии вызывается processEvent()  выход произойдет?
У Вас pop3Object создан в той же нитке - значит слот вызывается напрямую (DirectConnection, а не через eventLoop). Если Вы хотели чтобы до слота дело не дошло, укажите в connect QueuedConnection (хотя тогда неясно зачем Вы его эмиттили после quit). Вообще - цель непонятна


Название: Re: завершение потока
Отправлено: blood_shadow от Апрель 29, 2011, 22:56
а если в текущем событии вызывается processEvent()  выход произойдет?
У Вас pop3Object создан в той же нитке - значит слот вызывается напрямую (DirectConnection, а не через eventLoop). Если Вы хотели чтобы до слота дело не дошло, укажите в connect QueuedConnection (хотя тогда неясно зачем Вы его эмиттили после quit). Вообще - цель непонятна
вас наверно смутили названия классов объектов Pop3ConnectionThread и Pop3ConnectionObject,
pop3Object создается в методе run() объекта Pop3ConnectionThread,
который живет в основном потоке, pop3Object же живет в другом потоке и потому коннект:
Код:
connect(this, SIGNAL(threadStop()), &pop3Object, SLOT(stopExecution())); 
уже никак не будет DirectConnection


Название: Re: завершение потока
Отправлено: Igors от Апрель 30, 2011, 00:41
вас наверно смутили названия классов объектов Pop3ConnectionThread и Pop3ConnectionObject,
pop3Object создается в методе run() объекта Pop3ConnectionThread,
который живет в основном потоке, pop3Object же живет в другом потоке ..
Лучше проверить распечатав currentThreadId на эмиторе и слоте. Но в любом случае неясно чего Вы хотели добиться. Выйти из exec? Ну и выходите через quit или exit (если не жалко остаток очереди). Если нитка занята расчетами, то можно ей намекнуть что надо закругляться выставив флажок (как и у Вас). Это все работает кроме упомянутого случая:

Если нитка ждет на мутексе, waitCondition или семафоре, сначала надо ее оттуда снять, чтобы она смогла заняться посланными ей сигналами/флажком