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);

很順暢,小熊目前沒有發現什么問題。

 

情況二:依附線程發送消息,線程接收消息

暫未使用到,待補充

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM