Прерывание QThreads со слотами и сигналами

У меня есть класс, который содержит QThread. В функции инициализации этого класса должен быть запущен поток. Это работает правильно. в ветке там у меня while(bool certainCondition){} это certainCondition надо поменять на сигнал/слот соединение.

Проблема в том, что во время работы сигнал/слот не открывается.


person user1957388    schedule 08.05.2013    source источник
comment
Не могли бы вы опубликовать код, чтобы показать, как именно «сигнал/слот не открыт»?   -  person spiritwolfform    schedule 08.05.2013
comment
Вам нужно просто дождаться определенного условия? я думаю, что здесь может быть полезен QWaitCondition.   -  person eraxillan    schedule 08.05.2013


Ответы (2)


Вы не запускаете цикл событий в своем потоке, или вы долгое время блокируете свой цикл while. Ваш слот не может быть вызван до тех пор, пока вы не вернете управление циклу обработки событий, что произойдет после завершения цикла while.

В качестве обходного пути вы можете попробовать вызвать QCoreApplication::processEvents() внутри вашего цикла while.

person sashoalm    schedule 08.05.2013

Чтобы сигналы/слоты работали между потоками, должен выполняться цикл событий.
Если вы используете цикл while, цикл событий никогда не запускается, и, следовательно, сигналы не принимаются.
Обычно вы работаете именно так. цикл событий:

void Thread::run()
{
    ...do something
    exec();  //<<this runs the event loop
}

Теперь ваша проблема в том, что вы хотите непрерывно запускать какой-то код, пока не будет выполнено какое-то условие. В приведенном выше коде это не сработает из-за вызова exec().
Есть 2 возможности решить эту проблему (в зависимости от того, чего вы хотите достичь в своем цикле):

  1. Используйте QTimer, который срабатывает, скажем, каждые 5 секунд и вызывает слот, который выполняет ваш повторяющийся код.

  2. Используйте QWaitCondition для проверки выполнения определенного условия; но тогда вы не сможете использовать сигналы и слоты; вместо этого вы должны вызвать QWaitCondition.

person Kurt Pattyn    schedule 25.08.2013