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();