У меня есть класс, который содержит QThread
, В функции инициализации этого класса поток должен быть запущен. Это работает правильно. в теме есть у меня while(bool certainCondition){}
этот certainCondition
должен быть изменен соединением сигнал / слот.
Проблема в том, что во время работы сигнал / слот не открывается.
Вы не запускаете цикл обработки событий в своем потоке или длительное время блокируете его в цикле while. Ваш слот не может быть вызван, пока вы не вернете управление циклу событий, который произойдет после Вы закончили цикл пока.
В качестве обходного пути вы можете попробовать позвонить QCoreApplication :: processEvents () внутри вашего цикла
Чтобы сигналы / слоты работали между потоками, должен выполняться цикл обработки событий.
Если вы используете цикл while, цикл обработки событий никогда не запускается и, следовательно, сигналы не принимаются.
Вот как вы обычно запускаете цикл обработки событий:
void Thread::run()
{
...do something
exec(); //<<this runs the event loop
}
Теперь ваша проблема в том, что вы хотите непрерывно запускать некоторый код, пока не будет выполнено какое-то условие. В приведенном выше коде это не будет работать из-за exec()
вызов.
Есть 2 варианта решения этой проблемы (в зависимости от того, чего вы хотите достичь в цикле):
Используйте QTimer, который запускает, скажем, каждые 5 секунд, и вызывает слот, который выполняет ваш повторяющийся код.
Используйте QWaitCondition для проверки выполнения определенного условия; но тогда вы не можете использовать сигналы и слоты; вместо этого вы должны вызвать QWaitCondition.