C++ 并行执行两个线程,其中一个线程包含一个事件

C++ 并行执行两个线程,其中一个线程包含一个事件,c++,qt,C++,Qt,我有两个函数必须在特定的时间间隔后执行。所以我创建了两个线程,每个函数在单独的线程中执行。其中一个函数“checkForEvent()”有一个事件正在等待事件发生 当“checkForEvent()”函数正在等待事件时,另一个函数“checkServer()”即使在单独的线程中运行,也不会执行 dongleThread = new QThread(this); checkDongle = new QTimer(); checkDongle->setInterval(DONGLE_CHECK

我有两个函数必须在特定的时间间隔后执行。所以我创建了两个线程,每个函数在单独的线程中执行。其中一个函数“checkForEvent()”有一个事件正在等待事件发生

当“checkForEvent()”函数正在等待事件时,另一个函数“checkServer()”即使在单独的线程中运行,也不会执行

dongleThread = new QThread(this);
checkDongle = new QTimer();
checkDongle->setInterval(DONGLE_CHECK_TIMER);
checkDongle->moveToThread(dongleThread);
connect(checkDongle, SIGNAL(timeout()), this, SLOT(checkForEvent()));
connect(dongleThread, SIGNAL(started()), checkDongle, SLOT(start()));
dongleThread->start();

serverThread = new QThread(this);
checkServer = new QTimer();
checkServer->setInterval(SERVER_CHECK_TIMER);
checkServer->moveToThread(serverThread);
connect(checkServer, SIGNAL(timeout()), this, SLOT(checkServer()));
connect(serverThread, SIGNAL(started()), checkServer, SLOT(start()));
serverThread->start();

checkForEvent() //This function is waiting for an Event

checkServer()
如何在单独的线程中执行这两个函数?
谢谢

您的
connect
调用使用默认的连接类型:
Qt::AutoConnection
。这意味着:

Qt::AutoConnection:如果接收器位于发出信号的线程中,则使用Qt::DirectConnection。否则,将使用Qt::QueuedConnection。连接类型在发出信号时确定

这里您的
QTimer
this
位于不同的线程中。这意味着将使用
Qt::QueuedConnection

QueuedConnection:当控件返回到接收方线程的事件循环时,将调用该插槽。插槽在接收器的线程中执行

因此,您的两个插槽在
this
的线程中被调用。如果一个阻塞,另一个将永远不会运行

解决此问题的一种方法是将辅助对象移动到自己的线程。worker对象将调用
checkForEvent
,并在等待结束后发出信号。此信号可以连接到
中的
检查服务器
。这样,您只需要一个线程。有关辅助对象的更多信息,请参阅
QThread
的文档