如何将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):槽函数在发送者的线程中立即执行,不是线程安全的。
阅读全文