Qt執行緒中使用socket作為客戶端通訊 二

2021-09-13 19:03:24 字數 2558 閱讀 6805

qt使用執行緒的方式有兩種,一種是上次所說的繼承qthread重新實現run()函式,在run()函式中一直迴圈處理;另一種則是繼承qobject並使用movetothread()函式將物件移到子執行緒中。由於繼承qthread方式使用的並不規範,qt官方強烈建議使用繼承qobject的方式。

根據之前編寫程式得到的結果,在相對複雜的ui設計中,如果socket通訊放在住ui中,並且讓伺服器每間隔10ms傳送資料,這樣會影響ui的響應,所以應將socket接收資料部分放到執行緒中。由上次程式得出的結果,使用繼承qthread的方式並不可行,所以這次使用繼承qobject的形式。經測試得出,繼承qobject該方式不會造成ui的卡頓。

下面直接貼段**壓壓驚:

客戶端.h部分:

#ifndef myclient_h

#define myclient_h

#include

#include

class qtcpsocket;

class myclient : public qobject

q_object

public:

explicit myclient(qobject *parent = 0);

bool connectserver();

void writemsgtoserver(qstring str);

signals:

public slots:

void slot_readmsgfromserver();

private:

qtcpsocket *mp_clstcpsocket;

#endif // myclient_h

客戶端.cpp部分:

#include "myclient.h"

#include

myclient::myclient(qobject *parent) : qobject(parent)

mp_clstcpsocket = new qtcpsocket;

connect(mp_clstcpsocket, signal(readyread()),        //qt::queuedconnection

this, slot(slot_readmsgfromserver()));

bool myclient::connectserver()

mp_clstcpsocket->connecttohost("192.168.18.77",2115);//qt::blockingqueuedconnection

if (mp_clstcpsocket->waitforconnected(1000))

qdebug() << "connect success !";

return true;

}else{

qdebug() << "connect faild !";

return false;

void myclient::writemsgtoserver(qstring str)

mp_clstcpsocket->write(str.tolatin1());

void myclient::slot_readmsgfromserver()

qbytearray recmsg = mp_clstcpsocket->readall();

qdebug() << "recmsg from server:" << recmsg;

為測試,ip和port直接使用固定的。

ui部分簡要程式:

myclient *mp_clsclient;

qthread *mp_thread;

widget建構函式部分:

mp_thread= new qthread;

mp_clsclient = new myclient();

mp_clsclient->connectserver();

mp_clsclient->movetothread(mp_thread);

startthread按鈕:

mp_thread->start();

send按鈕:

結果如圖:

伺服器端:

以目前我的知識水平來講,之前在qt執行緒中使用socket的方法是不正確的。如果以後遇到新的解決方式,會重新更新!

***********************    update   *******  2019 09 07********************

以上的內容是錯誤的,老鐵們不要被誤導,正確方式如下:

qt執行緒中使用socket的正確開啟方式

執行緒方法中使用了Socket應該注意的

最近在實現qnfacs系統風力發電機應用,問題描述 1 開啟執行緒監聽網路,執行緒的方法 死迴圈監聽 中使用了socket,在終止 abort 方法 後,再次建立 啟動 執行緒,反覆執行這個動作 終止 建立 這個過程中,開啟任務管理器,發現該程序中的執行緒數沒有都增加1。懷疑是不是有什麼執行緒沒有關...

在socket中使用網域名稱

客戶端中直接使用ip位址會有很大的弊端,一旦ip位址變化 ip位址會經常變動 客戶端軟體就會出現錯誤。而使用網域名稱會方便很多,註冊後的網域名稱只要每年續費就永遠屬於自己的,更換ip位址時修改網域名稱解析即可,不會影響軟體的正常使用。關於網域名稱註冊 網域名稱解析 host 檔案 dns 伺服器等本...

Django中,使用redis作為快取

已有django專案,在其中設定以redis為快取。1 安裝django redis pip install django redis 2 在settings裡面配置cache設定 caches 3 設定好後可以在shell中測試一下 1 在終端中啟動shell python manage.py s...