没志青年
发布于 2025-09-10 / 17 阅读
0

QT 多线程

QT使用 QThread 类来描述线程,QThread 提供了一个与平台无关的管理线程的方法,一个QThread对象管理一个线程。

为什么需要多线程?

  • 进行耗时操作:如果在UI线程(主线程)里面进行耗时操作,界面会不响应用户操作,界面会卡顿

  • 提升程序性能:发挥多核 CPU 的性能,多线程并行处理事务,可以大大提升程序的性能。

使用多线程注意事项:

  • Qt 的默认线程为UI线程(主线程):负责窗口事件处理或窗口控件数据的更新

  • 子线程负责后台的业务逻辑,子线程不能对窗口对象做任何操作,这些事交给UI线程

  • 主线程和子线程之间如果进行数据的传递,需要使用信号槽机制

QThread 类介绍

提供的方法

  • start

  • wait

  • quit

  • exec

  • exit

  • run

提供的 static 方法

  • usleep、msleep、sleep:线程等待

  • currentThread:当前线程对象的地址

  • currentThreadId:当前线程的ID

提供的信号

  • finished:

  • started:

三种实现多线程的方式

继承 QThread

使用 moveToThread 移动到子线程中

工作线程

主线程

Worker *worker = new Worker;
// 将工作对象移动到另一个线程
worker->moveToThread(&workerThread);

// 线程结束,删除工作对象
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);

// 线程启动,工作对象开始执行任务
connect(&workerThread, &QThread::finished, worker, &Worker::doWork);

// 任务执行完后,通知主线程,主线程可以销毁线程,线程销毁以后工作对象也会被删除
connect(worker, &Worker::resultReady, this, &Controller::handleResults);

// 启动工作线程
workerThread.start();

workerThread.quit();
workerThread.wait();

使用线程池