QThread с проблемами соединения QTimer - PullRequest
0 голосов
/ 08 ноября 2018

Есть ли что-то не так с этим, это дает мне странные ошибки компиляции:

функция-кандидат недопустима: нет известного преобразования из '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 голосов
/ 08 ноября 2018

Есть 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)

Лямбда:

[&]{ timer.start(); }
0 голосов
/ 09 ноября 2018

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

Этот код хорошо выполняет свою работу:

// 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();
}
0 голосов
/ 08 ноября 2018
connect(&connectionThread, &QThread::started, &timer, &QTimer::start);

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

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