Qt訊號和槽線上程之間傳遞
阿新 • • 發佈:2018-11-28
Qt中的訊號和槽的機制是Qt中最常用的也是最具優勢的一個特點,但是使用起來有時候會遇到一些問題,最近一直在用Qt做專案,其中使用到了通過訊號線上程之間傳遞資料,發現了一些問題,最後通過各種蒐集資料及自己的測試,最後總結了一下。
在run函式中發射訊號,在主執行緒處理,執行緒的start函式一定要放在connect函式之後,connect第五個引數不用寫,內部機制會自己判斷是同線程還是不同執行緒,預設引數即可,訊號中帶有引數的時候要注意是否是可以排隊(不同執行緒之間訊號傳遞是通過佇列的)的(即是否是基本的資料型別),如果使用了非基本資料型別,槽函式是不能相應的,這時候需要在connect所在的建構函式裡自己通過函式進行定義(在connect之前),比如我在傳參的時候用到了uint16_t這個引數,需要以下函式轉換
qRegisterMetaType<uint16t>("uint16_t");
引數不能排隊Qt會有錯誤提示,但不是報錯;
以下是我的建構函式,可以參考
GprsDataproc::GprsDataproc(QObject *parent) : QObject(parent)
{
connect(&m_UdpGprs, SIGNAL(ptCIR_Frame(uint8_t*,uint16_t)), this, SLOT(GMGprsData_Proc(uint8_t*,uint16_t)));
qRegisterMetaType<uint16_t>("uint16_t");
connect(&m_GMGprs, SIGNAL(ptCIR_Frame2(uint8_t*, uint16_t)), this, SLOT(GMGprsData_Proc(uint8_t *, uint16_t)));
m_GMGprs.start();
}