1. 程式人生 > >qt下利用connect跨執行緒傳送資料

qt下利用connect跨執行緒傳送資料

 最近在做某廠家的nvr外掛開發,涉及到qt下多執行緒的開發,遇到這樣的一個問題,對於nvr裡的每一路資料,我們都建立一個執行緒A,但是每一個執行緒A裡又存在另外一個執行緒B(即nvr取資料的回撥函式)。我們現在想要將回調函式取得的資料通過TCP傳送出去,原本就想著直接在回撥函式裡呼叫Socket來進行資料的傳送,但是發現,雖然回撥函式是屬於縣城A的,但是線上程A裡建立的socket是不能線上程B裡進行呼叫的,因為涉及了跨執行緒,而Qt的tcp是不支援跨執行緒的。因此要實現資料的傳送,唯一的方法就是講回撥函式的資料傳給執行緒A,這樣,資料和socket就在一個執行緒。對於qt來說,最簡單的方法當然是通過訊號與槽來發送資料,即將執行緒B的資料通過signal傳送到執行緒A。

              好了,原本的打算是線上程B(即回撥函式)裡建立一個signal,線上程A裡建立一個slots,通過在回撥函式裡emit(signal)將資料傳到執行緒A裡,但是在實現時,卻遇到一個問題,即執行緒B是一個封裝好的static的回撥函式,其沒有父物件,這樣,我們在connect時,對應的signal就沒有物件。

             後來經過試驗發現,其實線上程B裡也可以呼叫執行緒A的signal,通過執行緒A的signal來將執行緒B的資料傳送給執行緒A。具體實現方法如下:

eg  :執行緒A(物件為worker) :   connect(this,SIGNALS(send(QByteArray)),this,SLOTS(receive(QByteArray)));

                     signal:send(QByteArray data);

                    slots: receive(QByteArray data);

執行緒B為一個回撥函式,其沒有父物件,

                     emit(worker->send(data));

這樣,就可以將執行緒B的data傳送到執行緒A裡面的receive函式裡進行處理