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