当前位置: 首页 > article >正文

QT-thread2种方式选择的优劣对比

1.第一种方式:使用 QObject 的 moveToThread()
QObject+Qthread

class MessageWriter : public QObject
{
    Q_OBJECT
public slots:
    void writeDataToFile();
};

 threadMsgExchange = new QThread();
 MessageWriter *writer = new MessageWriter();
 writer->moveToThread(threadMsgExchange);
 threadMsgExchange->start();

第二种:继承 QThread 直接实现线程任务

class ThreadMsgExchange : public QThread
{
    Q_OBJECT

public:
    ThreadMsgExchange(QObject *parent, int interval);
    void setInterval(int interval);

protected:
    void run() override;

private:
    int m_interval;
};

ThreadMsgExchange::ThreadMsgExchange(QObject *parent, int interval)
    : QThread(parent), m_interval(interval) {}

void ThreadMsgExchange::run()
{
    while (true) {
        QThread::sleep(m_interval);
        QString record = QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss") + " - 数据记录";
        emit appendRecordToFile(record);
    }
}

在Qt中,使用QThread来创建和管理线程是一种常见的做法。以下是两种常见的线程实现方式,并对它们的优劣进行比较:

  1. 继承QThread: 这种方式是创建一个新的类,继承自QThread,并重写run方法。在run方法中实现线程的具体逻辑。

    优点:

    • 代码结构清晰,易于理解和维护。
    • 可以直接在run方法中处理线程的逻辑,不需要额外的线程间通信机制。

    缺点:

    • 如果线程的逻辑比较复杂,可能会导致run方法过于庞大,不利于代码的可读性和维护。
    • 如果需要在多个地方使用相同的线程逻辑,可能需要重复编写相同的代码。
  2. 使用QObjectQThread的组合: 这种方式是创建一个QObject的子类,并将其移动到一个QThread实例中。通过信号和槽机制来实现线程间的通信。

    优点:

    • 可以将线程的逻辑封装在一个QObject子类中,使得代码更加模块化和可重用。
    • 通过信号和槽机制,可以方便地实现线程间的通信,避免了复杂的线程同步问题。

    缺点:

    • 代码结构相对复杂,需要理解QObjectQThread的工作原理。
    • 如果信号和槽的连接不正确,可能会导致程序出现难以调试的问题。

总结与对比

特性第一种方式(moveToThread第二种方式(继承 QThread
线程管理方式QObject 对象移至 QThread,通过信号与槽机制控制执行。直接继承 QThread,重载 run() 方法直接定义线程任务。
灵活性高,可以将多个对象移至同一线程,任务执行与线程管理分离。较低,每个 QThread 子类通常只能执行单一任务。
控制粒度较弱,受限于 QObject 的事件循环。较强,可以精细控制线程执行过程,如暂停、停止等。
线程通信通过信号与槽机制进行线程间通信。通过信号与槽机制通信,且 run() 方法内可直接处理任务逻辑。
资源占用如果线程数量过多,可能需要额外的事件循环支持,效率略低。更直接、更高效,但可能会增加线程管理的复杂性。
适用场景多任务需要并行执行时较为适用,可以通过 moveToThread 灵活管理多个任务。如果任务是独立的、需要较高控制精度的,使用继承 QThread 更合适。


http://www.kler.cn/a/420900.html

相关文章:

  • Ai编程cursor + sealos + devBox实现登录以及用户管理增删改查(十三)
  • 【C++】深入优化计算题目分析与实现
  • 「Mac畅玩鸿蒙与硬件38」UI互动应用篇15 - 猜数字增强版
  • 终端环境下关闭显示器
  • AI常见同义词-关键概念
  • Redis 之持久化
  • uniapp 生成二维码
  • 量化交易系统开发-实时行情自动化交易-8.9.通达信平台
  • docker部署RustDesk自建服务器
  • 【自用】管材流转项目前端重部署流程 vue2 webpackage4 vuecli4
  • Webpack开发模式及处理样式资源
  • Hyperf jsonrpc
  • 利用 Redisson 实现分布式主键生成
  • echarts 实时 vue 使用方法
  • Python学习------第十五天
  • 12.02 深度学习-卷积
  • 东方隐侠网安瞭望台第8期
  • 手游手游手游手游手游手游手游
  • c语言基础之二维数组
  • node.js基础学习-fs模块-文件操作(六)
  • 深度学习常用测试命令解释
  • 数据分析:探索数据背后的秘密与挑战
  • 3d/伪3d统计图形
  • ISO26262-(Timing Monitoring)在多核MCU的TPU上功能安全ASILB与ASILD有什么区别
  • MacOS 命令行详解使用教程
  • LlaSMol—— 建立一个大型、高质量的指令调整数据集 SMolInstruct 用于开发一个化学任务的大语言模型