Qt 多線程的信號傳遞
- QObject::connect(const QObject * sender, const char * signal,
- const QObject * receiver, const char * method,
- Qt::ConnectionType type = AutoConnection);
這個函數默認(即最後一個參數type爲AutoConnection)情況下只能在相同線程下的不同類之間傳遞信號,若想要把信號傳遞給另外一個線程下運行的類實例,必須要修改type的枚舉值。
可以改爲Qt::QueuedConnection,這樣就能傳遞給其他線程下的類實例了。
另外,對於帶參數的消息,參數的數據類型必須爲Qt支持的元數據類型,如int、QString等,若要傳遞自定義的數據類型,必須把自定義的數據類型註冊爲元數據類型。
舉個例子,比如我再兩個線程下分別運行了兩個類實例MainWindow *mainWnd和Manager *mngr,MainWindow把方法addUsers(LPHOSTSTRUCT )設爲槽,Manager把方法NewUserCome(LPHOSTSTRUCT )設爲消息,其中LPHOSTSTRUCT爲自定義的數據類型。要是想在Manager中順利的使用emit NewUserCome(lpHost)(lpHost爲LPHOSTSTRUCT的一個實例),就要經過兩步
一、註冊LPHOSTSTRUCT爲Qt的元數據類型
- qRegisterMetaType<LPHOSTSTRUCT> ("LPHOSTSTRUCT");
二、調用QObject::connect方法,連接信號和槽,這裏要注意修改connect方法的第五個參數
- QObject::connect(mngr, SIGNAL(NewUserCome(LPHOSTSTRUCT)), mainWnd, SLOT(addUser(LPHOSTSTRUCT)));
小結:Qt 中多線程信號傳遞 實例的內容介紹完了,希望本文能幫你解決問題。