news 2026/8/8 10:24:35

QT:QThread、moveToThread、QueuedConnection

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
QT:QThread、moveToThread、QueuedConnection

QThread

QThread 子类化方式

优点:

简单直接:代码结构相对清晰,直接在子类中重写 run 方法来实现线程执行的任务。
这种方式对于简单的线程任务,开发起来较为迅速,易于理解和维护。
紧密集成:子类与 QThread 紧密结合,能够方便地访问 QThread 的各种属性和方法,例如设置线程优先级、获取线程 ID 等

缺点:

违反单一职责原则:QThread 类既负责线程的管理(如启动、停止、暂停等),又要承载具体的业务逻辑。如果业务逻辑复杂,会使 QThread 子类变得臃肿,难以维护和扩展。例如,当业务逻辑需要修改或添加功能时,可能会影响到线程管理部分的代码。
潜在的线程安全问题:由于 QThread 子类的 run 方法在新线程中执行,而其他成员函数可能在主线程中被调用,这就需要开发者格外小心地处理线程同步问题,以避免数据竞争等线程安全问题。例如,在 run 方法和其他成员函数中共享数据时,需要使用锁机制来保证数据的一致性。

代码

WorkerThread.h

#ifndefWORKERTHREAD_H#defineWORKERTHREAD_H#include<QThread>#include<QDebug>#include<random>#include<chrono>#include<QTimer>classWorkerThread:publicQThread{Q_OBJECTpublic:explicitWorkerThread(QObject*parent=nullptr);~WorkerThread();protected:voidrun()override;private:};#endif// WORKERTHREAD_H

WorkerThread.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_distribution<>distrib(1,100);while(true){intrandomNumber=distrib(gen);qDebug()<<"Generated random number: "<<randomNumber;std::this_thread::sleep_for(std::chrono::seconds(5));}}

main.cpp

std::shared_ptr<WorkerThread>workerthread=std::make_shared<WorkerThread>();workerthread->start();

moveToThread

基于 QObject 的 moveToThread 模式

优点:

分离职责:将业务逻辑封装在 QObject 子类中,而 QThread 只负责线程的管理。这样使得代码结构更加清晰,易于维护和扩展。
更好的线程安全:QObject 的信号槽机制是线程安全的,通过信号槽进行线程间通信可以有效地避免数据竞争等线程安全问题。例如,Worker 类可以通过信号将计算结果发送回主线程,主线程通过槽函数接收并处理,无需手动管理复杂的同步操作。
灵活性高:可以方便地将多个 QObject 移动到同一个线程中,或者在运行时动态地将 QObject 在不同线程间移动,以满足不同的业务需求。例如,在一个复杂的多线程应用中,可以根据任务的类型和负载情况,动态地调整 QObje

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/8 10:21:32

【AI】AutoResearch将一定程度上替代算法工程师

基于2026年3月的最新研究进展&#xff0c;AutoResearch&#xff08;自动研究&#xff09;正成为AI领域最激进的范式转移之一。以下是基于Andrej Karpathy开源项目及相关学术工作的完整解析&#xff1a; 一、核心理念&#xff1a;从"人驱动实验"到"计算驱动发现&…

作者头像 李华
网站建设 2026/8/8 10:21:55

turbo迁移vite-plus实践

Turbo 是一个高性能的构建系统&#xff0c;结合 pnpm monorepo 使用非常流行。它通过任务调度与缓存机制&#xff0c;大幅提升多仓库开发体验。 vite&#xff08;vite-plus&#xff09; 则提供了一套统一的工具链&#xff08;vite、vitest、oxlint、oxfmt、rolldown、tsdown、v…

作者头像 李华
网站建设 2026/8/8 10:23:21

Claude Code Skills 资源大盘点:导航站 + GitHub 精选仓库全整理

先说几个我觉得必装的 Skills 文档类 Skills&#xff08;docx / pdf / pptx / xlsx&#xff09; 这四个是我用得最高频的。本质上是把怎么用 Python 库生成对应格式文件的最佳实践打包进去&#xff0c;让 CC 不会每次都写出奇奇怪怪的代码。 docx skill&#xff1a;生成带目…

作者头像 李华
网站建设 2026/8/8 10:23:04

服务器中都有哪些常见的安全问题?

服务器作为企业数据与业务的核心枢纽&#xff0c;其安全性直接关乎用户信任与商业存续。恶意攻击、配置疏漏及内部风险交织&#xff0c;形成复杂的安全威胁图谱。以下从攻击类型、漏洞利用、数据风险三个维度&#xff0c;系统梳理服务器面临的典型安全问题&#xff1a;一、网络…

作者头像 李华
网站建设 2026/7/14 15:25:06

青少年CTF实战:从万能密码到图片隐写,手把手教你破解CheckMe系列题目

青少年CTF实战&#xff1a;从万能密码到图片隐写&#xff0c;手把手教你破解CheckMe系列题目 在CTF竞赛的世界里&#xff0c;每一道题目都像是一个等待解开的谜团。对于青少年参赛者来说&#xff0c;CheckMe系列题目往往成为他们接触网络安全竞赛的第一道门槛。这些题目看似简单…

作者头像 李华