Qt中进行线程编程可以使用QThread、QRunnable和QThreadPool等类。
- QThread
QThread是Qt中最基本的线程类,它封装了系统级别的线程。使用QThread创建一个新线程的步骤如下:
class MyThread : public QThread {
public:
void run() override {
// 线程执行的代码
}
};
// 创建并启动新线程
MyThread *thread = new MyThread();
thread->start();
上述代码定义了一个继承自QThread的子类,并重写了run()函数。在主线程中,创建并启动一个新的MyThread对象即可实现在新线程中执行run()函数里面的代码。
- QRunnable和QThreadPool
如果不需要直接继承QThread来创建新线程,也可以使用更高级别的抽象:QRunnable和QThreadPool。
class MyTask : public QRunnable {
public:
void run() override {
// 任务执行的代码
}
};
// 创建并启动多个任务
MyTask *task1 = new MyTask();
MyTask *task2 = new MyTask();
QThreadPool::globalInstance()->start(task1);
QThreadPool::globalInstance()->start(task2);
上述代码定义了一个继承自QRunnable的子类,并重写了run()函数。在主线程中,通过调用全局静态函数QThreadPool::globalInstance()
获取到一个全局共享池对象,并通过start()函数将多个任务添加到池子里面,由池子自行管理线程的创建和销毁。
- 线程间通信
在多线程编程中,线程之间的通信是一个非常重要的问题。Qt提供了一些机制来实现线程间通信,包括信号槽机制、QEvent和QWaitCondition等。
例如,我们可以在新线程中发送一个信号,然后在主线程中接收这个信号并处理:
class MyThread : public QThread {
signals:
void resultReady(int);
protected:
void run() override {
// 线程执行的代码
int result = 42;
emit resultReady(result); // 发送结果信号
}
};
// 创建并启动新线程
MyThread *thread = new MyThread();
QObject::connect(thread, &MyThread::resultReady, [](int result){
qDebug() << "Result: " << result;
});
thread->start();
上述代码定义了一个继承自QThread的子类,并在其中定义了一个resultReady()信号。在run()函数中,当任务完成后会发射这个信号。在主线程中,通过connect()函数将这个信号与一个Lambda表达式相连接,当收到这个信号时就输出结果。
以上是Qt中进行基本的多线程编程方法。需要注意,在多线程编程中需要遵循一些规则以保证程序的正确性和稳定性,例如避免共享资源、锁定关键区域等。