QTcpSocket 在子執行緒執行測試筆記

2021-07-31 12:49:58 字數 1658 閱讀 9076

本文是在子執行緒成建立qtcpsocke物件,並且向本地服務端在不同時刻傳送不同指令。網上教程有很多,但發現大多數開啟子執行緒的方式都是子類化qthread,然後在run()函式中寫入需要執行的**,但有篇部落格強烈批評了該做法,主要原因請看以下兩篇部落格。

#include

#include

class worker : public qobject

}private:

qtcpsocket *tcp;

//int i;

public:

void foo()

public slots:

void connect()

void onsend1()

void onsend2()

};

定義乙個dummy類用於與出現子執行緒:

class dummy:public qobject

};

主函式:

#include "main.moc"

int main(int argc, char *argv)

在此需要注意一點,物件內定義的成員變數是屬於定義該物件的執行緒的,意思是worker是在main()定義,那麼worker中定義的成員變數是屬於主線程的,在其他slot函式中使用是屬於跨執行緒使用。因此,如果在worker的建構函式中對qtcpsocket進行例項化,那麼執行上述方式的話,就會出現以下錯誤:

所以在conntect() 在對qtcpsocket進行了例項化,並通過workder的析構函式**其記憶體,防止記憶體洩漏。

正確執行結果如下圖所示:

從結果可以看到,dummy::foo() 實際上是在主線程執行的,而通過訊號/槽機制呼叫的dummy的slot函式是在子執行緒中執行的。

個人總結

接觸qt時間很短,訊號/槽機制、以及事件並不是特別熟悉,既然這個方式是正確的,就先學著吧。而這個方法可以看做是qthread物件開啟了乙個執行緒,然後可以將qobject的子類物件放進這個執行緒中,如果需要呼叫qobject子類物件的函式,需要通過訊號/槽機制來實現。

關於失去thread join子執行緒無法執行的問題

include include void fun void s return null intmain void sleep 1 pthread join tid,null return0 這段 就是呼叫子執行緒列印幾句話,當主線程中沒有pthread join函式的時候子執行緒並沒有執行,查閱資料...

在子執行緒中Toast

問題 直接在普通子執行緒中toast會報錯 錯誤關鍵 1.普通的執行緒不能直接new乙個handle,而toast初始化 中如下 片 public class toast 2.為什麼普通執行緒不能new乙個handle?handle類 如下 public handler looper類中的 片段 p...

在子執行緒中建立執行緒的方法

與在主線程建立子執行緒的方法是一樣的 重慶郵電學院計算機系綜合微機室 馬英傑 windows95是microsoft公司的第乙個真正的多工作業系統。在每一時刻可以有多個程序同時工作,而每乙個程序又包含有多個執行緒。但只有乙個處理器的計算機不可能真正地 同時 執行多個執行緒,而是作業系統把時間分成若干...