有了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個連接。