如何将QT多线程编程为?
摘要:多线程 QThread类提供了多线程的支持,一般从QThread继承定义自己的线程类。Qt提供了QMutex、QWaitCondition、QSemaphore等同步机制,可以方便地实现线程间的同步。和 Qt Concurrent 模块,可
多线程
QThread类提供了多线程的支持,一般从QThread继承定义自己的线程类。Qt提供了QMutex、QWaitCondition、QSemaphore等同步机制,可以方便地实现线程间的同步。和 Qt Concurrent 模块,可以方便地实现多线程编程。
C++11标准线程
使用std::thread直接绑定函数或可调用对象。
#include <thread>
void task() { /* ... */ }
std::thread t(task);
t.join(); // 等待线程结束
生命周期管理:需手动调用join()(阻塞等待)或detach()(分离线程)
QT线程
方法一: 继承 QThread,重写 run()
本质:QThread 对象本身(即 this)生活在旧线程(通常是主线程),而重写的 run() 方法运行在新线程。
适用场景:一个独立的、长时间运行的“计算任务”或“工作线程”,与主线程交互较少。它更像是线程本身的控制器。
注意:在新线程的 run() 函数内创建的对象(局部变量)才属于新线程。
#include <QThread>
class MyThread : public QThread {
void run() override { /* ... */ }
};
MyThread thread;
thread.start();
方法二: 使用 moveToThread()
本质:将一个业务逻辑对象(Worker)的所有槽函数移动到另一个线程的事件循环中去执行。QThread对象管理线程,Worker对象执行业务。
适用场景:需要利用 Qt 的事件循环机制(如计时器、网络套接字)或需要与主线程进行频繁、复杂的信号槽交互。这是 Qt 官方更推荐的现代风格。
核心:Worker 对象不能有父对象,否则无法moveToThread。
错误做法:Worker *worker = new Worker(this); (指定父对象)
正确做法:Worker *worker = new Worker; (无父对象)
自动连接 (Auto Connection):这是默认连接方式。当信号和槽在不同线程时,Qt 会自动将其转换为队列连接 (QueuedConnection)。这意味着信号发出后,事件会被放入接收者所在线程的事件循环中,等待被处理,从而实现线程安全的通信。
直接连接 (Direct Connection):槽函数在发送者的线程中立即执行,不是线程安全的。
