原创 圖片拖動並交換圖片-使用觀察者模式
使用觀察者模式來做。主窗口是觀察者,圖片控件是被觀察者, 圖片被拖動的時候,圖片控件要通知觀察者,移動之後的位置座標+圖片控件本身的索引號 MySubject.h(被觀察者-抽象類) #ifndef MYSUBJECT_H #define
原创 圖片拖動並交換圖片
Hero.h #ifndef HERO_H #define HERO_H #include <QToolButton> #include <QMouseEvent> class Hero : public QToolButton {
原创 27.多線程,分組服務端,1萬客戶端連接,每秒處理200萬包
問題:網絡抖動,不能穩定在每秒鐘,200萬個包。波動比較大,80萬----300萬之間波動。 服務端: CELLTimestamp.hpp #ifndef _CELLTimestamp_hpp_ #define _CELLTimestam
原创 26.服務端單線程模式下性能瓶頸測試
VS2015 提供的性能探查器,可以看到程序的哪部分代碼佔用了多少的cpu 可以看到 FD_SET select FD_ISSET recv這幾個個函數佔用的cpu比較高 將服務端改造成,多線程分組處理多客戶端 1.分離處理客戶端連接的函數
原创 24.原子操作
參考資料:https://zhuanlan.zhihu.com/p/107092432 所謂原子操作,就是多線程程序中“最小的且不可並行化的”操作。 對於在多個線程間共享的一個資源而言,這意味着同一時刻,多個線程中有且僅有一個線程在對這個資
原创 25.客戶端多線程分組模擬高頻併發數據
兩種結構的客戶端對比網絡消息性能 服務端均爲單線程服務端。 1.單線程客戶端,1000個連接 2.多線程客戶端,4個線程,每個線程250個連接 結論:多線程的客戶端,網絡性能提升非常大。 -------------------------
原创 22.線程自解鎖
代碼結構比較複雜的情況下,手動加鎖,解鎖,可能會有所遺漏。 這種情況下,推薦使用自解鎖(自解鎖在構造的時候lock,在析構的時候unlock)(對象在超出作用域時會執行析構) 自解鎖,手動鎖優缺點:自解鎖每次都會構造,析構。在執行效率上沒有
原创 23.線程鎖的使用
不合理的設定臨界區域,會讓線程的調用失去意義。 1.不應該頻繁的使用鎖 2.減小鎖使用的區域,線程公共資源之外 的資源 儘量不要放到臨界區。 -------------------------------------------------
原创 21.多線程-鎖與臨界區域
不合理的設定臨界區域,會讓線程的調用失去意義。 代碼一: #include <iostream> #include <thread> #include <mutex> using namespace std; mutex m_lock
原创 19.添加高精度計時器測量處理能力
在windows系統下可以使用“資源監視器”來查看網絡活動詳情。 在服務端代碼中添加一個高精度計時器,統計每秒鐘收到了多少個完整數據包。 c++11 chrono(高精度時鐘,可達納秒級別) 客戶端: DataHeader.hpp #if
原创 20.多線程-基本代碼
示例一: #include <iostream> #include <thread> using namespace std; void thread1() { for (int n = 0; n<4; n++)
原创 18.windows使用select突破64個socket
windows默認FD_SETSIZE大小爲64,Linux的select默認只支持1024個句柄 在引入#include <WinSock2.h>之前,定義: #define FD_SETSIZE 1024 就能實現突破64個s
原创 17.windows平臺穩定性,高吞吐
1.網絡收發穩定性 2.windows使用select達到連接上限 服務端在執行select時SOCKET上限數量爲FD_SETSIZE windows系統定義: #define FD_SETSIZE 64 typedef str
原创 16.服務端、客戶端解決粘包問題,服務端加入退出指令線程
客戶端: DataHeader.hpp #ifndef _MessageHeader_hpp_ #define _MessageHeader_hpp_ enum CMD { CMD_LOGIN, CMD_LOGIN_R
原创 15.爲什麼會粘包
1、發送端 send SendBuf 發送緩衝區(在各種操作系統下面緩衝區大小存在差異) 2、 網絡傳輸層 數據流 3、接收端 RecvBuf 接收緩衝區 select recv