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

承接上章: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, &TcpSessio
  • 5
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: QT的TCP通信使用线程池可以提高系统的并发性和响应性。通常情况下,使用单个线程来处理TCP通信可能会导致系统在处理大量连接时出现阻塞,影响系统的性能。 通过使用线程池,可以将TCP通信任务分配给多个线程来处理,从而使系统能够同时处理多个连接。线程池包含一组线程,这些线程在需要时可以立即执行任务。这样,可以确保每个连接都能获得足够的CPU时间,而不会被其他连接阻塞。 QT线程池机制可以方便地管理线程的生命周期,分配和回收线程资源。当一个连接建立时,可以从线程池中获取一个线程来处理该连接,当连接终止时,可以将线程归还给线程池。这种方式可以避免不断创建和销毁线程的开销,提高系统的效率。 通过使用线程池,还可以实现线程的复用。当一个连接完成任务后,并不立即销毁线程,而是将线程放回线程池,以供下一个连接使用。这样可以避免线程的频繁创建和销毁,减少系统的开销,提高系统的性能。 总而言之,QT的TCP通信使用线程池可以提高系统的并发性和响应性,减少线程的创建和销毁开销,提高系统的性能和效率。 ### 回答2: 在Qt中,TCP通信可以使用线程池来实现。线程池是一种管理和调度多个线程的机制,可以有效地利用系统资源并提高程序的性能。 在使用Qt进行TCP通信时,我们可以使用QtQtConcurrent模块配合线程池来处理通信任务。QtConcurrent模块提供了一些方便的类和函数来进行并行编程,其中就包括了线程池。 首先,我们需要创建一个线程池对象,并指定线程池中的线程数量。可以根据需要来调整线程数量,以避免线程过多或过少造成的资源浪费或程序性能下降。 然后,我们可以使用QtConcurrent::run()函数来将需要执行的通信任务放入线程池中执行。该函数接受一个函数指针或lambda表达式作为参数,用于指定要执行的任务。同时,我们还可以通过该函数的返回值来获取任务的执行结果。 在通信任务中,我们可以使用QtQTcpSocket类来进行TCP通信操作。比如,可以使用QTcpSocket的connectToHost()函数来连接到服务器,使用write()函数来发送数据,使用read()函数来接收数据等等。 通过使用线程池,我们可以将通信任务分配给多个线程同时处理,提高了程序的并发性能。同时,线程池还可以根据系统资源的使用情况动态调整线程数量,以避免资源浪费和程序性能下降。 总之,通过在Qt中使用线程池来处理TCP通信,可以提高程序的性能和并发能力,同时还可以更好地利用系统资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值