一切从0开始,小小的手机网游服务端教程,其实我只是一个初学者。【二】GameApp主进程类

主进程GameApp类,派生自Applicatin类,目的也就是在程序执行的时候能够执行GameApp类的初始化,运行,退出清理工作,而GameApp类的目的是在运行的时候启动每个模块的线程(例如gate线程,game log线程,定时器线程等等),在接受到退出信号(SIGTERM, SIGINT)的时候做清理工作。


先写Application类吧,作为GameApp类的父类:

#ifndef __APPLICATION_H__
#define __APPLICATION_H__

class Application
{
public:
	Application(){}
	~Application(){}

	//程序初始化
	virtual int  init(int argc, char** argv){ return 0; }
	//程序主要执行函数
	virtual int  main(int argc, char** argv){ return 0; }
	//程序退出做清理动作
    virtual void retire() {}
	//通过虚函数方式使子类执行init, main, retire函数
	int run(int argc, char** argv)
	{
		if (init(argc, argv) != 0)
		{
			return -1;
		}
		main(argc, argv);
		retire();
		return 0;
	}
protected:
	//用来接收退出信号
	void exit_waiting()
	{
		sigset_t sset;
		sigemptyset(&sset);
		sigaddset(&sset, SIGQUIT);
		sigaddset(&sset, SIGTERM);
		sigaddset(&sset, SIGQUIT);
		sigprocmask(SIG_BLOCK, &sset, NULL);
		int sig = 0;
		for (;;)
		{
			int ret = sigwait(&sset, &sig);
			if (ret == 0)
			{
				break;
			}
		}
	}
};
#endif



现在编写主进程类GameApp:

//game_app.h
#ifndef __GAME_APP_H__
#define __GAME_APP_H__

#include "application.h"
#include "thread.h"
#include "game.h"

class GameApp: public Application
{
public:
	virtual int init(int argc, char **argv);
	virtual int main(int argc, char **argv);
	virtual void retire();
private:
	Game m_game;
	Thread m_game_thread;
};

#endif



这里有个Thread类,在下一节后面会说,目的是启动一个线程并且执行Game线程的启动,运行,退出动作。


GameApp实现:

//game_app.cpp
#include "game_app.h"

int GameApp::init(int argc, char **argv)
{
	return 0;
}

int GameApp::main(int argc, char **argv)
{
	//所有线程会在这里启动
	m_game_thread.start(&m_game);

	exit_waiting();
	return 0;
}

void GameApp::retire()
{
}

GameApp类编写好了,接着写入口函数main:

写到这里,编译运行一下程序看看,先写入口函数吧:

//main.cpp
#include "game_app.h"

int main(int argc, char **argv)
{
	GameApp app;
    return app.run(argc, argv);
}

通过虚函数的方式,会执行GameApp类里的main函数,之后启动各个线程,现在只有一个Game线程类。

下一节将会写Game子线程主逻辑类。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。