Qt QThread两种方式的使用:1-继承QThread重写run函数; 2- 继承QObject并moveToThread && 消息和槽在线程和依附线程间的传递

2019年08月18日起笔

方式一:继承QThread重写run函数

MyThread.h
-----------------------------------
...
class MyThread : public QThread
{
protected:
  void run();
}

MyThread.cpp
-----------------------------------
...
void MyThread::run()
{
    //do something    
    ...
    exec();
}

Main.cpp
------------------------------------
...
MyThread * myThread = new MyThread;
MyThread.start();
...

方式二:继承QObject并moveToThread

MyWork.h
--------------------------------------
class MyWork : public QObject
{
Q_OBJECT
public:
    explict MyWork(QObject * parent = nullptr);
public slots:
    void slotsDoWork();
};

MyWork.cpp
--------------------------------------
MyWork::MyWork(QObject *parent):QObject(parent)
{}

void MyWork::slotsDoWork()
{
      //do something
}

someWhere.cpp
--------------------------------------
...
QThread * thread = new QThread(this);
MyWork * myWork = new MyWork;

QObject::connect(thread, &QThread::started, myWork, &MyWork::slotsDoWork); MyWork
->moveToThread(thread); thread->start();
/*
*深入:thread 和 myWork分别在哪个线程中运行? :https://www.cnblogs.com/azbane/p/11465466.html
*/

消息和槽在线程和依附线程间的传递:

首先说明:依附线程是指创建线程的线程。

情况一:线程发射消息,依附线程接收消息

    一.1继承QThread重写run函数,小熊尝试失败,针对代码及编译错误消息如下:

MyThread.h
---------------------------------
signals:
    void signalsA();

MyThread.cpp
---------------------------------
void MyThread::run()
{
    ...
    emit signalsA();
    ...
}

编译错误:
---------------------------------
LNK2019:无法解析的外部符号"public: void __thiscall MyThread::signalsA(void)"(?signals@MyThread@@QAEXXZ),该符号在函数 " protected: virtual void __thiscall MyThread::run(void) " (?run@MyThread@@MAEXXZ)中被引用

在run函数中发射消息编译会报错....就不用写关联此信号的槽..了

    一.2继承QObject并moveToThread

MyWork.h
------------------------------------
signals:
    void  signalsA();

MyWork.cpp
------------------------------------
void MyWork::slotsDoWork()
{
    ...
    emit signalsA();  
    ...
}

someWhere.cpp
-----------------------------------
QObject::connect(myWork, &MyWork::signalsA, this, &someWhere::slotsToDoSomething);

很顺畅,小熊目前没有发现什么问题。

 

情况二:依附线程发送消息,线程接收消息

暂未使用到,待补充

 

原文链接: https://www.cnblogs.com/azbane/p/11372531.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    Qt QThread两种方式的使用:1-继承QThread重写run函数; 2- 继承QObject并moveToThread    &&  消息和槽在线程和依附线程间的传递

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/398557

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月12日 上午9:43
下一篇 2023年4月12日 上午9:43

相关推荐