本系列所有文章可以在這里查看[http://blog.csdn.net/cloud_castle/article/category/2123873](http://blog.csdn.net/cloud_castle/article/category/2123873)
Qt官方Demo中,Fortune(財富) Example很多,包括系列1中的Fortune Server Example, Fortune Client Example, 系列4中的Blocking Fortune Client Example, 系列5中的Threaded Fortune Server Example。有時候歸類學習是一個挺不錯的方法,它能迅速幫你理清思路。
這里畫了幾個圖來描繪它們各自的實現過程,為了簡明,只描述了主要的部分。

在Fortune Server/Client Example中,tcpSocket做為類成員變量寫在GUI線程中,Server服務器通過調用tcpsocket的Listen()監聽是否有來自客戶端的連接,
當Client客戶端通過connectToHost()連接到Server后,Server端由QTcpSocket *clientConnection = tcpServer->nextPendingConnection()創建了基于
該連接對象的套接字,通過write(block)向客戶端發送數據。
這種方式好不好呢,好,簡單明了,代碼也少。但是如果發送的數據太頻繁,太大,對于主線程的壓力是可想而知的。在實際工程中,數據通信也多是放在單獨的線程使用。
那么多線程的客戶端怎么實現呢?

Blocking Fortune Client有兩個主類,一個是BlockingClient,繼承自QDialog,負責窗體的搭建,響應用戶操作等,說白了就是GUI主線程。還有一個FortuneThread類繼承自QThread,QTcpSocket對象創建在FortuneThread的run()函數中。用戶需要接受數據的時候,通過BlockingClient向FortuneThread
發送一個請求,通過線程連接到主機,FortuneThread接收到來自主機的數據再通過信號槽機制返回給主線程。像這種客戶端使用阻塞模式是很常見的,因為它只有一個Socket,而且使用阻塞網絡的API邏輯上更為簡單。但是能在GUI主線程上使用阻塞嗎?當然不行,界面一卡死用戶罵不死你。。。還有一點可以看出,由于部分工作由次線程接管,主界面的代碼量明顯減少,這是模塊化編程所提倡的。
回到線程上面來,BlockClient并沒有在每次RequestNewFortune()時創建一個新的FortuneThread,而是調用一個全局的thread來進行操作,這樣必然帶來競爭,解決的辦法是使用互斥鎖(QMutex)。在這種機制下,FortuneThread一次只能處理一個請求,不過對于客戶機而言,一般也夠了。

Thread Fortune Server Example里面的類就更多啦,除了界面類和線程類,還有一個FortuneServer類繼承自QTcpServer。為什么不像上面那個例子一樣直接在線程創建一個QTcpServer對象呢?因為服務器與客戶機不同,它面對往往都是多個客戶機并發的請求。如果像上一個例子那樣先鎖住資源響應第一個,再解鎖,再鎖住響應第二個,再響應第三個。。。。好吧這個服務器這是太棒了。。。那么此時我們需要對每一個客戶機的請求創建一個單獨的線程來進行響應。此時我們不再需要互斥鎖來保護資源。
Dialog類負責界面繪制,并通過server.listen()開啟FortuneServer的監聽事件,一旦有客戶機連接上來,server通過IncomingConnection()開啟一個新的線程FortuneThread,該線程則負責將財富(Fortune)發送給客戶端,之后將自身銷毀。
好了,就先到這里吧~
- 前言
- 1——Fortune Server/Client
- 2——Multicast Sender/Receiverz
- 3——Broadcast Sender/Receiver
- 4——Blocking Fortune Client
- 5——Threaded Fortune Server
- 5(總結)——Fortune例程的各個實現區別
- 6——Loopback Example
- 7——Analog Clock Example
- 8——Shaped Clock Example
- 9——Analog Clock Window Example
- 10——Qt Quick Particles Examples - Emitters
- 11——Qt Quick Particles Examples - Affectors
- 12——Qt Quick Particles Examples - CustomParticles
- 13——Qt Quick Particles Examples - Image Particles
- 14——Qt Quick Particles Examples - System
- 15——Chapter 1: Creating a New Type
- 16——Chapter 2: Connecting to C++ Methods and Signals
- 17——Chapter 3: Adding Property Bindings
- 18——Chapter 4: Using Custom Property Types
- 19——Chapter 5: Using List Property Types
- 20——Chapter 6: Writing an Extension Plugin
- 21——Extending QML - Adding Types Example
- 22——Extending QML - Object and List Property Types Example
- 23——Extending QML - Inheritance and Coercion Example
- 24——Extending QML - Default Property Example
- 25——Extending QML - Methods Example
- 26——Extending QML - Grouped Properties Example
- 27——Extending QML - Attached Properties Example
- 28——Extending QML - Signal Support Example
- 29——Extending QML - Property Value Source Example
- 30——Extending QML - Binding Example
- 31——StocQt
- 32——Qt Quick Examples - Threading
- 33——Qt Quick Examples - Window and Screen
- 34——Concentric Circles Example
- 35——Music Player
- 36——Wiggly Example
- 37——Vector Deformation