QT 实现同步阻塞超时等待另一个线程的信号功能
时间: 2024-09-26 17:07:37 浏览: 27
在Qt中,要实现在主线程中同步阻塞地等待另一个线程的信号,并设置超时时间,你可以使用`QWaitCondition`和`QMutex`配合`QThread`来实现。`QWaitCondition`用于线程间的通信,而`QMutex`则用来确保数据的安全访问。
以下是一个简单的例子:
```cpp
#include <QObject>
#include <QThread>
#include <QWaitCondition>
#include <QMutex>
class WorkerThread : public QThread
{
public:
explicit WorkerThread(QObject* parent = nullptr) : QThread(parent), done(false)
{
// 初始化你的线程任务
}
protected:
void run() override
{
// 执行耗时任务
// ...
emit taskFinished();
done = true;
}
signals:
void taskFinished();
private:
bool done;
};
class MainThread : public QObject
{
public slots:
void waitForTaskWithTimeout(int timeoutMS)
{
WorkerThread worker;
worker.start(); // 启动新线程
QMutex mutex;
QWaitCondition waitCond;
// 设置超时
QTimer::singleShot(timeoutMS, this, &MainThread::timeout);
mutex.lock();
while (!worker.isFinished()) { // 阻塞等待直到任务完成
if (waitCond.wait(mutex, timeoutMS * 1000)) { // 每次检查是否有信号,如果有的话就返回true
// 有信号,继续处理
} else {
// 超时,结束等待
break;
}
}
mutex.unlock();
if (!worker.isFinished()) {
qDebug() << "Task timed out";
} else {
qDebug() << "Task finished";
}
}
private:
void timeout()
{
// 如果到了超时时间,唤醒等待的线程
qApp->postEvent(this, new QTimerEvent(QTimer::SingleShot));
}
};
```
在这个例子中,`WorkerThread`负责执行耗时的任务,当任务完成后发出`taskFinished()`信号。`MainThread`的`waitForTaskWithTimeout`槽函数启动一个新线程并进入阻塞状态,直到接收到`taskFinished`信号或达到指定的超时时间。`QMutex`确保了对条件变量的操作不会导致数据竞争。