QT:QThread、moveToThread、QueuedConnection
QThreadQThread 子类化方式优点:简单直接:代码结构相对清晰,直接在子类中重写 run 方法来实现线程执行的任务。这种方式对于简单的线程任务,开发起来较为迅速,易于理解和维护。紧密集成:子类与 QThread 紧密结合,能够方便地访问 QThread 的各种属性和方法,例如设置线程优先级、获取线程 ID 等缺点:违反单一职责原则:QThread 类既负责线程的管理(如启动、停止、暂停等),又要承载具体的业务逻辑。如果业务逻辑复杂,会使 QThread 子类变得臃肿,难以维护和扩展。例如,当业务逻辑需要修改或添加功能时,可能会影响到线程管理部分的代码。潜在的线程安全问题:由于 QThread 子类的 run 方法在新线程中执行,而其他成员函数可能在主线程中被调用,这就需要开发者格外小心地处理线程同步问题,以避免数据竞争等线程安全问题。例如,在 run 方法和其他成员函数中共享数据时,需要使用锁机制来保证数据的一致性。代码WorkerThread.h#ifndefWORKERTHREAD_H#defineWORKERTHREAD_H#includeQThread#includeQDebug#includerandom#includechrono#includeQTimerclassWorkerThread:publicQThread{Q_OBJECTpublic:explicitWorkerThread(QObject*parent=nullptr);~WorkerThread();protected:voidrun()override;private:};#endif// WORKERTHREAD_HWorkerThread.cpp#include"WorkerThread.h"WorkerThread::WorkerThread(QObject*parent):QThread(parent){qDebug()"WorkerThread created in thread:"QThread::currentThread();}WorkerThread::~WorkerThread(){qDebug()"WorkerThread destroyed";}voidWorkerThread::run(){// 使用随机数引擎和分布std::random_device rd;std::mt19937gen(rd());std::uniform_int_distributiondistrib(1,100);while(true){intrandomNumber=distrib(gen);qDebug()"Generated random number: "randomNumber;std::this_thread::sleep_for(std::chrono::seconds(5));}}main.cppstd::shared_ptrWorkerThreadworkerthread=std::make_sharedWorkerThread();workerthread-start();moveToThread基于 QObject 的 moveToThread 模式优点:分离职责:将业务逻辑封装在 QObject 子类中,而 QThread 只负责线程的管理。这样使得代码结构更加清晰,易于维护和扩展。更好的线程安全:QObject 的信号槽机制是线程安全的,通过信号槽进行线程间通信可以有效地避免数据竞争等线程安全问题。例如,Worker 类可以通过信号将计算结果发送回主线程,主线程通过槽函数接收并处理,无需手动管理复杂的同步操作。灵活性高:可以方便地将多个 QObject 移动到同一个线程中,或者在运行时动态地将 QObject 在不同线程间移动,以满足不同的业务需求。例如,在一个复杂的多线程应用中,可以根据任务的类型和负载情况,动态地调整 QObje
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2421403.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!