Qt的多线程机制允许开发者在单个应用程序进程中创建并行任务,从而实现高效的资源利用和流畅的用户体验。
1. QThread 类:
- Qt 提供了
QThread
类来实现跨平台的多线程功能。 - 每个
QThread
对象代表一个操作系统级别的线程。 - 不建议直接在
QThread
对象的子类中覆盖run()
函数并在其中执行长耗时任务;而是应该创建一个工作类,继承自QObject
,并在线程中移动这个工作对象,使其在新线程的事件循环中执行任务。
头文件
#include<QThread>
所属模块:
QT += core
2. 线程的创建与启动:
- 创建一个新的线程通常包括实例化一个
QThread
对象,创建一个要在新线程上执行任务的工作类实例,并将该工作类移动到新线程中。 - 通过调用
QThread::start()
方法启动线程,这会触发QThread
对象的run()
函数,但在现代Qt实践下,run()
函数主要用于启动事件循环而非执行具体业务逻辑。
3. 线程间通信:
- Qt的信号和槽机制可用于线程间的通信,由于它是类型安全且异步的,所以特别适合于多线程环境。
- 使用
moveToThread()
函数将一个QObject移动到另一个线程中后,其发出的信号会在目标线程的事件循环中排队,通过连接信号到槽,可以在不同线程之间安全地传递数据和控制流。
// Worker.h
#include <QObject>
class Worker : public QObject
{
Q_OBJECT
public:
using QObject::QObject;
public slots:
void doWork() {
// 这里放置你要在新线程中执行的具体任务
for (int i = 0; i < 1000000; ++i) {
// 假设这是一个耗时的操作
// ...
qDebug() << "Working in thread:" << QThread::currentThreadId();
}
emit workFinished();
}
signals: