承接上章: Qt一步步搭建TcpServer2——线程池
本章将在上一章的基础上,讲述如何安全的关闭与启动Server。
前言
首先要更正上一篇的一个文字错误:
在这里这样用信号槽,并且删除Session是安全的。因为其事件循环机制是在按线程来的,在退出session线程之后,才会进入下一个线程的事件循环机制。因此这里不会存在这种隐患。
这里解释下,因为我代码是跟着博客每篇进度来写的,也就是说准备写某篇的时候,再把其功能实现,而设计这种工作本来是不断优化的。每一天的想法都可能不一样,或者说这算是具现每个阶段的过程思路,所以每一篇的代码,可以注意到和前一篇的方式和想法可能会略有出入。但整体不会变化。
1、Server启动
Server端的启动,主要依赖于监听端口和线程数量,可以封成Config类,包含数据的验证和初始化过程,如果需要拓展,也更方便:
TcpServer头文件:
//Server数据格式
struct ServerData
{
uint16_t Port;
uint32_t ThreadNum;
//验证逻辑,不合法则设定初始值
void Verify()
{
if(Port == 0)
Port = 12345;
if(ThreadNum)
ThreadNum = std::thread::hardware_concurrency();
}
};
class TcpServer : public QTcpServer
{
Q_OBJECT
public:
TcpServer();
~TcpServer();
bool Start(ServerData &conf);
......
//后面代码就不贴了
cpp:
bool TcpServer::Start(ServerData &conf)
{
if(IsRunning_)
return true;
//验证数据
conf.Verify();
//启动线程池
SessionThreads_.Start(conf.ThreadNum);
//监听端口
if(!this->listen(QHostAddress::Any, (quint16)conf.Port))