Qt一步步搭建TcpServer2——线程池

该博客介绍了如何在Qt中逐步构建一个带有线程池的TcpServer。首先封装TcpThread类,然后修改TcpSession以配合线程池工作。接着创建SessionThreads作为会话线程池,负责管理会话和线程。最后调整TcpServer,使其专注于监听端口和接受连接,将其他任务交给线程池处理。文章讨论了关服顺序和QtTcpSocket的同步断开连接问题。
摘要由CSDN通过智能技术生成

承接上章: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() << 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值