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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: завершение потока  (Прочитано 3290 раз)
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(); завершается только когда обработает текущее событие?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #1 : Апрель 29, 2011, 18:15 »

Получается exec(); завершается только когда обработает текущее событие?
exec завершается когда из очереди eventLoop извлечено событие quit. То есть текущее событие точно будет допилено до конца, а может и другие что стоят в очереди перед quit.

Выйти посылая сигнал не удается если нитка ждет на мутексе или семафоре, как впрочем и с помощью флажка stopped.
Записан
blood_shadow
Гость
« Ответ #2 : Апрель 29, 2011, 18:51 »

Получается exec(); завершается только когда обработает текущее событие?
exec завершается когда из очереди eventLoop извлечено событие quit. То есть текущее событие точно будет допилено до конца, а может и другие что стоят в очереди перед quit.

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

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Апрель 29, 2011, 19:30 »

а если в текущем событии вызывается processEvent()  выход произойдет?
У Вас pop3Object создан в той же нитке - значит слот вызывается напрямую (DirectConnection, а не через eventLoop). Если Вы хотели чтобы до слота дело не дошло, укажите в connect QueuedConnection (хотя тогда неясно зачем Вы его эмиттили после quit). Вообще - цель непонятна
Записан
blood_shadow
Гость
« Ответ #4 : Апрель 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
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Апрель 30, 2011, 00:41 »

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

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


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