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

1.第一种方式:使用 QObjectmoveToThread()
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 更合适。
相关推荐
SimonKing1 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean2 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven973 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55112 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java
冰_河12 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
桦说编程15 小时前
从 ForkJoinPool 的 Compensate 看并发框架的线程补偿思想
java·后端·源码阅读
躺平大鹅17 小时前
Java面向对象入门(类与对象,新手秒懂)
java
初次攀爬者18 小时前
RocketMQ在Spring Boot上的基础使用
java·spring boot·rocketmq
花花无缺18 小时前
搞懂@Autowired 与@Resuorce
java·spring boot·后端