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);
很順暢,小熊目前沒有發現什么問題。
情況二:依附線程發送消息,線程接收消息
暫未使用到,待補充