Название: завершение потока Отправлено: blood_shadow от Апрель 29, 2011, 16:31 есть поток Pop3ConnectionThread, ф-ция run потока:
Код
и ф-ция которая останавливает поток и слот объекта pop3Object: Код
сигнал threadStop() останавливает слот: Код
Вывод в консоль - Код: In Slot Получается 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. Название: 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). Вообще - цель непонятнаpop3Object создается в методе run() объекта Pop3ConnectionThread, который живет в основном потоке, pop3Object же живет в другом потоке и потому коннект: Код: connect(this, SIGNAL(threadStop()), &pop3Object, SLOT(stopExecution())); Название: Re: завершение потока Отправлено: Igors от Апрель 30, 2011, 00:41 вас наверно смутили названия классов объектов Pop3ConnectionThread и Pop3ConnectionObject, Лучше проверить распечатав currentThreadId на эмиторе и слоте. Но в любом случае неясно чего Вы хотели добиться. Выйти из exec? Ну и выходите через quit или exit (если не жалко остаток очереди). Если нитка занята расчетами, то можно ей намекнуть что надо закругляться выставив флажок (как и у Вас). Это все работает кроме упомянутого случая: pop3Object создается в методе run() объекта Pop3ConnectionThread, который живет в основном потоке, pop3Object же живет в другом потоке .. Если нитка ждет на мутексе, waitCondition или семафоре, сначала надо ее оттуда снять, чтобы она смогла заняться посланными ей сигналами/флажком |