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 更合适。
相关推荐
XuanXu11 分钟前
Java volatile关键字以及线程安全
java
都叫我大帅哥11 分钟前
代码世界的「万能转接头」:适配器模式的跨界艺术
java·后端·设计模式
蝈蝈噶蝈蝈噶21 分钟前
问题:tomcat下部署eureka双重路径
java·eureka·tomcat
禹曦a25 分钟前
Java进阶之旅-day05:网络编程
java·开发语言·网络
Evand J39 分钟前
【MATLAB例程】TDOA(到达时间差)定位的chan-tylor计算方法,三维环境,附代码下载链接
开发语言·matlab
五行星辰1 小时前
Gson修仙指南:谷歌大法的佛系JSON渡劫手册
java·后端
難釋懷1 小时前
JavaScript基础-移动端常用开发框架
开发语言·javascript
dot to one1 小时前
深入理解 C++ 三大特性之一 继承
开发语言·c++·visual studio
哈哈哈哈哈哈哈哈哈...........1 小时前
【无标题】object,wait,notifyAll
java·开发语言