Qt搭建多執行緒Server

2022-07-04 13:27:10 字數 2132 閱讀 2913

起因是mysql在android上沒有驅動。也就是說,移動端想要訪問遠端資料庫,必須通過一台(或多台)pc進行中轉。

中轉pc作為server,接受來自移動端socket訪問資料庫的要求,server訪問資料庫,取得資料,通過socket傳送給移動端。

qt寫個c/s其實很簡單,網上各種教程,硬傷:server!是!單!線!程!

假設有10000個移動端訪問中轉server,那麼如果server是單執行緒,那麼這10000個移動端是排隊通訊,排隊訪問資料庫,肯定完蛋!

所以server必須使用多執行緒。

qt的多執行緒是個經常讓新手搞錯的東西,很多文章中看起來是多執行緒,實際上根本就是單執行緒。

預設的c/s連線方式(acceptconnection)不支援多執行緒也是硬傷!

於是搞了好久,總算搞定了多執行緒server。

①首先寫server類,派生自qtcpserver, 只要過載 incomingconnection 這個虛函式就行了。

無須像單執行緒那樣  connect(&server,signal(newconnection()),this,slot(acceptconnection()));

void

server::incomingconnection (qintptr socketdescriptor)

在這個函式裡有幾個陌生的玩意。

socketthread類派生自qthread,子執行緒不解釋。

processor類派生自 qobject,這個類是重點。

qt多執行緒的最大問題在於,除了子執行緒的run函式是跑在子執行緒裡,執行緒其它函式(包括訊號/槽)都是跑在主線程裡。

我們的server肯定要處理client的請求,也就是socket的資料請求,在qt裡,這步被封裝在socket的readyread訊號裡。

就算你在run函式裡綁了readyread訊號,最後訊號還是會在主線程裡觸發。

解決方案是單獨寫個處理類,這裡就是processor類,將子執行緒movethread到這個物件中,這樣這個物件的所有函式都是在子執行緒裡執行了,work函式用於server接受請求以及返回資料庫資料。

這是qt 4.7之後,官方的推薦寫法,因為n多人的多執行緒寫的根本就是錯的,官方實在忍不了了。  

②再看 socketthread類

class socketthread : public

qthread

;socketthread::socketthread(

int id,qobject *parent):qthread()

void

socketthread::run ()

thread

建構函式不用多說,傳入系統為server分配的socket的識別id。

關鍵就是qthread的虛函式run。首先設定server的socket識別id。

記得呼叫qthread::run ();

否則這個run函式並沒有完全執行。

③再看processor類

void

processor::work ()

processor

成員就乙個指標m_socket,儲存子執行緒的socket位址。

以及乙個qbytearray作為緩衝區buff。

readall讀取client的socket,write寫回client的sokcet。

無聊的話可以把注釋拿掉,看看work函式的工作執行緒是否與主線程不同。

④client端

void

client::send ()

void client::get

()

這裡使用的策略如下:

每發乙個請求,連一次server,收到server的回覆後,斷開連線,防止占用sever資源。

get函式作為client的readyread的槽函式就行了。

qt 多執行緒

qt通過三種形式提供了對執行緒的支援。它們分別是,一 平台無關的執行緒類,二 執行緒安全的事件投遞,三 跨執行緒的訊號 槽連線。這使得開發輕巧的多執行緒qt程式更為容易,並能充分利用多處理器機器的優勢。多執行緒程式設計也是乙個有用的模式,它用於解決執行較長時間的操作而不至於使用者介面失去響應。在qt...

Qt 多執行緒

qt 包含下面一些執行緒相關的類 qthread 提供了開始乙個新執行緒的方法 qthreadstorage 提供逐執行緒資料儲存 qmutex 提供相互排斥的鎖,或互斥量 qmutexlocker 是乙個便利類,它可以自動對 qmutex 加鎖與解鎖 qreadwriterlock 提供了乙個可以...

Qt多執行緒

今天學習qt的多執行緒,在學習多執行緒主要是兩個方面。一是多執行緒的基礎概念,二是多執行緒的同步,三是怎麼和主線程進行通訊。在這個主線程上面可以開始由qthread建立的物件的新的執行緒。這些由qthread建立的物件的新的執行緒之間的通訊,是通過使用含有互斥量,讀寫鎖,訊號量或者等待條件的共享變數...