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...