上一節給大家從源碼級別分析了SNetClient網路客戶端的實現過程,詳見C++/Qt網路通訊模塊設計與實現(二),並給大家留了一個疑問,即引入SNetClientRunning類是為瞭解決什麼問題? 我們從SNetClient的設計出發,即要求線上程里進行數據包的收發,連接,斷開處理等,這些處理 ...
上一節給大家從源碼級別分析了SNetClient網路客戶端的實現過程,詳見C++/Qt網路通訊模塊設計與實現(二),並給大家留了一個疑問,即引入SNetClientRunning類是為瞭解決什麼問題?
我們從SNetClient的設計出發,即要求線上程里進行數據包的收發,連接,斷開處理等,這些處理不能在業務線程或者UI線程里進行。
說明
以下SNetClientRunning分析過程,我假定大家對信號槽連接類型(Qt::ConnectionType),發送信號的線程,接收者所依附的線程等都理解(這些屬於Qt的基本知識)。
發送
-
使用方調用SNetClient Send函數
-
數據投遞到發送緩衝區,觸發信號通知有數據
-
SNetClient線程收到通知則往socket寫,從而把數據發送給對方;採用通知方式,非輪詢方式
發送信號的線程為非SNetClient線程,往對方發數據需在SNetClient線程進行,因此在進行信號槽連接時,接收者所依附的線程必須是SNetClient線程,信號槽連接代碼如下
connect(this, SIGNAL(SignalSend()), m_pNetClientRunning, SLOT(SlotSend()), Qt::QueuedConnection); //QueuedConnection
SNetClientRunning與SNetClient線程是什麼關係?
詳細講解請點擊C++/Qt網路通訊模塊設計與實現(三)