一切从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); }
下一节将会写Game子线程主逻辑类。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。