3 简单服务框架
首先实现一个服务基类,定义好服务需要的基本接口。
Start()函数用来启动服务,启动前,在OnStart里做一些预处理;
Run()函数执行服务主循环,保证服务一直运行,并在合适的时机停止。
Stop()函数用来停止服务,停止前,可以在OnStop()函数中执行资源回收,数据保存和清理工作。
代码实现如下
#pragma once
class CServiceBase
{
public:
CServiceBase();
virtual ~CServiceBase();
public:
virtual bool Run();
virtual bool Start();
virtual void Stop();
public:
virtual void OnStart();
virtual void OnTick();
virtual void OnStop();
protected:
bool m_bRunning;
};
#include "ServiceBase.h"
#include <iostream>
#include <thread>
const int ServiceTickInterval = 50;
int LogInfo(std::string info)
{
std::cout << info.c_str() << std::endl;
return 0;
}
CServiceBase::CServiceBase()
: m_bRunning(false)
{
}
CServiceBase::~CServiceBase()
{
}
bool CServiceBase::Run()
{
LogInfo("ServiceBase Run");
while (m_bRunning)
{
std::this_thread::sleep_for(std::chrono::milliseconds(ServiceTickInterval));
OnTick();
}
return true;
}
bool CServiceBase::Start()
{
LogInfo("ServiceBase Start");
m_bRunning = true;
OnStart();
Run();
return false;
}
void CServiceBase::Stop()
{
LogInfo("ServiceBase Stop");
m_bRunning = false;
}
void CServiceBase::OnStart()
{
LogInfo("ServiceBase OnStart");
}
void CServiceBase::OnTick()
{
LogInfo("ServiceBase Tick");
}
void CServiceBase::OnStop()
{
LogInfo("ServiceBase OnStop");
}
这里稍微注意下,LogInfo函数中,只有一行语句,调用std::cout,增加LogInfo函数的目的,是方便后期替换为真正的日志输出函数,前期为了简便,直接通过控制台显示。
这是一个编程的小技巧:有多处使用系统函数或API接口的调用,尽量封装一个函数,可以避免后期需求变更时,全局搜索替换。
最后主函数调用
#include <iostream>
#include "ServiceBase.h"
int main(){
CServiceBase svr;
svr.Start();
return 0;
}
编译运行,可以看到控制台输出
ServiceBase Start
ServiceBase OnStart
ServiceBase Run
ServiceBase Tick
ServiceBase Tick
...
现在一个最基本的服务框架就完成了,服务运行后,可以每隔50毫秒执行一次OnTick函数,在这个函数中可以添加自己的逻辑。
下一章,我们增加网络消息收发功能,使服务具备网络交互能力。
Last updated