生成一个qt线程继承QThread,里面有个队列,一直循环 处理, 并给出一个退出出接口
时间: 2024-09-09 11:03:42 浏览: 29
在Qt框架中,如果你想创建一个拥有工作队列的线程,并且该线程能够持续处理队列中的任务直到接收到退出指令,你可以通过继承QThread类来实现。以下是一个简单的例子,展示如何创建这样的线程类:
```cpp
#include <QThread>
#include <QQueue>
#include <QMutex>
#include <QWaitCondition>
class WorkerThread : public QThread {
Q_OBJECT
public:
WorkerThread(QObject *parent = nullptr) : QThread(parent), running(false) {}
void run() override {
running = true;
while (running) {
// 获取队列中的任务
std::function<void()> task;
{
QMutexLocker locker(&queueMutex);
while (taskQueue.isEmpty() && running) {
waitCondition.wait(&queueMutex);
}
if (!running) break;
task = taskQueue.dequeue();
}
// 执行任务
task();
}
}
// 将任务添加到队列中
void enqueueTask(const std::function<void()> &task) {
{
QMutexLocker locker(&queueMutex);
taskQueue.enqueue(task);
}
waitCondition.wakeOne();
}
// 提供一个退出接口
void quitThread() {
running = false;
waitCondition.wakeOne();
QThread::quit();
}
private:
bool running; // 控制线程运行状态的标志
QQueue<std::function<void()>> taskQueue; // 任务队列
QMutex queueMutex; // 保护任务队列的互斥锁
QWaitCondition waitCondition; // 条件变量,用于在队列为空时等待
};
```
在这个例子中,`WorkerThread`类继承自`QThread`,它使用了`QQueue`来存储任务,并使用`QMutex`和`QWaitCondition`来同步线程操作。`run`方法是线程的入口点,它会一直循环直到`running`标志被设置为`false`。当任务队列为空时,线程会等待,直到有新的任务被添加到队列中或者退出信号被发出。
`enqueueTask`函数允许你向队列中添加任务,这些任务是`std::function<void()>`类型的函数对象。`quitThread`函数可以停止线程的执行并退出。
使用这个线程类时,你可以像这样使用:
```cpp
WorkerThread thread;
thread.start(); // 启动线程
// 添加任务
thread.enqueueTask([]() {
// 任务代码
});
// 当需要停止线程时
thread.quitThread();
thread.wait(); // 等待线程结束
```