Работа с потоками в Qt иногда может быть немного хлопотной. Это сообщение в блоге действительно открыло мне глаза.В случае, если мы примем стиль, предложенный в сообщении блога, к вашей проблеме, мы получим решение, подобное приведенному ниже.
Consumer::Consumer():
checkTimer_(new QTimer(this))
{
QObject::connect(checkTimer_, SIGNAL(timeout()), this, SLOT(onTimerExpiration());
QObject::connect(this, SIGNAL(ready()), this, SLOT(consume());
}
bool Consumer::event(QEvent *e)
{
if (e->type() == QEvent::ThreadChange)
{
QTimer::singleShot(0, this, SLOT(start());
}
return QObject::event(e);
}
void Consumer::consume()
{
getData();
processData();
emit ready();
}
void Consumer::start()
{
checkTimer_->start(1000);
emit ready();
}
void Consumer::onTimerExpiration()
{
qDebug() << "timeout";
}
Затем запустите его в отдельной теме следующим образом:
...
Consumer *consumer = new Consumer();
...
QThread *thread = new QThread(this);
thread->start();
consumer->moveToThread(thread);
Все дочерние объекты Consumer
будут выполняться в контексте потока, в который Consumer
был перемещен.Можно создать сигнал тайм-аута для класса Consumer
и связать его с объектом, который не работает в thread
.Qt гарантирует, что надлежащие типы сигналов / слотов будут применены к соединению после перемещения объекта в поток.
Я пропустил всю часть isRunning
, так как сомневаюсь, что она вам все еще нужна, покавы создаете только один Consumer
.