存在QTimer连接问题的QThread



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

候选函数不可行:第二个参数没有从"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();

有两个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(); }

您一开始就面临这个问题,这是您添加的一个复杂问题的结果:根本不需要连接。你可以立即启动计时器,然后移动它。在控件返回到计时器所在线程中的事件循环之前,计时器不会启动,而这在你的代码中不会发生,因为在你的程序返回到该程序运行的事件循环(如果有(之前,计时器被移动到另一个线程。

这个代码也能很好地完成任务:

// 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();
}
connect(&connectionThread, &QThread::started, &timer, &QTimer::start);

因为QTimer::start有两个重载函数。你必须使用旧的约定来指出要使用哪一个。

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

相关内容

  • 没有找到相关文章

最新更新