承接上章:Qt一步步搭建TcpServer1——封装QTcpServer,QTcpSocket
本章将在TcpServer的基础上新增线程池,管理Session。
1、封装TcpThread
正所谓工欲善其事,必先利其器。要实现一个线程池,按照Qt的线程用法(如果不懂用法的同学,可以参看我这篇博客:性能特性测试系列4——QT线程与std::thread(下)之QThread)。要想在这里好好用上去,还是得自己重写一个线程类:
头文件:
#ifndef TCPTHREAD_H
#define TCPTHREAD_H
#include <QThread>
#include <atomic>
class TcpThread : public QThread
{
public:
TcpThread();
~TcpThread();
virtual void run()override;
//会话数
std::atomic_uint32_t SessionCount = 0;
};
#endif // TCPTHREAD_H
cpp:
#include "TcpThread.h"
TcpThread::TcpThread()
{
}
TcpThread::~TcpThread()
{
}
void TcpThread::run()
{
exec();
}
又是个看起来很简单的类,别着急,以后还要加东西的。
关于run里的exec()解释下:
添加进事件循环,这样就能确保线程不执行完,且加进来的Session能够顺利接收自己的事件。
2、修改TcpSession
既然QThread都出来了,那么TcpSession也要相应的调整调整了:
头文件:
添加TcpThread的指针:
private:
TcpThread *Thread_ = nullptr;
构造函数修改下:
TcpSession(TcpThread *thread);
添加个信号函数和槽函数:
void SignalDisConnected(void *);
void SlotDisConnected();
cpp:
TcpSession::TcpSession(TcpThread *thread)
{
this->Thread_ = thread;
connect(this, &TcpSession::readyRead,
this, &TcpSession::SlotStartRead);
connect(this, &TcpSession::disconnected,
this, &TcpSession::SlotDisConnected);
}
TcpSession::~TcpSession()
{
disconnect(this, &TcpSession::readyRead,
this, &TcpSession::SlotStartRead);
disconnect(this, &TcpSession::disconnected,
this, &TcpSession::SlotDisConnected);
}
void TcpSession::Disconnect()
{
qDebug() <<