QThread与QTimer连接问题

时间:2018-11-08 01:25:23

标签: c++ qt qt5 qthread qtimer

这有什么问题吗,这给了我奇怪的编译错误:

  

候选函数不可行:'void没有已知的转换   (QThread :: *)(QThread :: QPrivateSignal)'到'const char *'为第二   论点

QTimer timer;
timer.setInterval(3000);
connect(&timer, &QTimer::timeout, this, &ThisClass::runConnectionCheck);
QThread connectionThread;
timer.moveToThread(&connectionThread);
connect(&connectionThread, &QThread::started, &timer, &QTimer::start);
connectionThread.start();

3 个答案:

答案 0 :(得分:4)

有2个QTimer插槽,称为start(),因此编译器会感到困惑,因此您应该QOverload

connect(&connectionThread, &QThread::started, &timer, QOverload<>::of(&QTimer::start));

static_cast<>()

connect(&connectionThread, &QThread::started, &timer,static_cast<void (QTimer::*)()>(&QTimer::start));

@KubaOber提供2个选项:

C ++ 14:

qOverload<>(&QTimer::start)

Lambda:

[&]{ timer.start(); }

答案 1 :(得分:1)

首先面对这个问题是由于添加了一个复杂的结果:根本不需要连接。您可以立即启动计时器,然后再移动它。在控件返回到计时器所在的线程中的事件循环之前,计时器不会触发,并且这不会在您的代码中发生,因为在您的代码返回事件循环之前,计时器已移至另一个线程(如果有) ),此代码将在其上运行。

这段代码也可以完成这项工作:

// https://github.com/KubaO/stackoverflown/tree/master/questions/timer-move-start-53200294
#include <QtCore>
int main(int argc, char *argv[]) {
   QCoreApplication app(argc, argv);
   int fired = 0;

   QTimer timer;
   QThread connectionThread;
   QObject::connect(&timer, &QTimer::timeout, [&] {
      Q_ASSERT(QThread::currentThread() == &connectionThread);
      ++fired;
      timer.moveToThread(qApp->thread());  // move the timer back to allow destruction
      QCoreApplication::quit();
   });
   timer.start(3000);
   timer.moveToThread(&connectionThread);

   Q_ASSERT(!fired);
   connectionThread.start();
   app.exec();
   Q_ASSERT(fired);

   connectionThread.quit();
   connectionThread.wait();
}

答案 2 :(得分:0)

connect(&connectionThread, &QThread::started, &timer, &QTimer::start);

因为 QTimer :: start 具有两个重载功能。您必须使用旧的约定指出要使用的约定。

connect(&connectionThread,SIGNAL(started()),&timer,SLOT(start()));