程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> QT 線程池 + TCP 小試(三)實現最終功能

QT 線程池 + TCP 小試(三)實現最終功能

編輯:C++入門知識

 有了TCP、線程池,我們就可以把他們連接起來。使用最簡單的 QMainWindow吧,設計個UI,而後,創建我們的線程池、Service,並把TcpService 的數據接收信號與線程池的數據處理信號連接起來。
      為了模擬處理任務,我們簡單的設計一個轉換大小寫字符的函數作為處理過程的模擬,這樣有利於在超級終端調試、模擬。
[cpp] 
#ifndef MYTASKITEM_H 
#define MYTASKITEM_H 
 
#include "qghthreadtaskitem.h" 
 
class MyTaskItem : public QGHThreadTaskItem 

    Q_OBJECT 
 
public: 
    MyTaskItem(QObject *parent); 
    ~MyTaskItem(); 
 
public: 
    virtual void run(QObject * task_source, const QByteArray & data_array); 
 
signals: 
    void evt_SendData(QObject * objClient,const QByteArray & dtarray); 
}; 
 
#endif // MYTASKITEM_H 

上述的類中的信號用來把處理結果發回生產者(也可以是別的消費者,取決於信號的連接)
[cpp] 
void MyTaskItem::run(QObject * task_source, const QByteArray & data_array) 

    QByteArray res; 
    foreach (char c,data_array) 
    { 
        res.push_back((c>='a'&& c<='z')?c+('A'-'a'):c); 
        if (c==015) 
            res.push_back(012); 
 
    } 
    emit evt_SendData(task_source,res); 
    return ; 

簡單的大小寫轉換,以及為了超級終端設置的換行符格式轉換。為了模擬吃力的運算時間,我們加上一個sleep
[cpp] 
void MyTaskItem::run(QObject * task_source, const QByteArray & data_array) 

    QByteArray res; 
    foreach (char c,data_array) 
    { 
        res.push_back((c>='a'&& c<='z')?c+('A'-'a'):c); 
        if (c==015) 
            res.push_back(012); 
 
    } 
    _sleep (50); 
    emit evt_SendData(task_source,res); 
    return ; 


具體工程參見我的資源, _sleep 在資源中並沒有加上。
上幾個圖,首先是服務端的配置,

設置端口、線程數、是否為每個客戶端發來的數據包保持FIFO,以及發回消費者時載荷的大小。而後,啟動,運行客戶端連接

客戶端是一個模擬程序,會模擬N個連接發送數據。當然,在XP下一個程序只許開10個連接。



作者:goldenhawking

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved