先来一段伪代码:
-
class App
-
{
-
void run() //业务处理函数
-
{
-
while(1)//接收到特殊指令后再退出循环
-
{...}
-
}
-
};
-
-
int main()
-
{
-
LOG(INFO)<<"start up"; //日志输出
-
App app;
-
LOG(INFO)<<"app run";
-
app.run(); //业务处理
-
LOG(INFO)<<"app exit";
-
return 0;
-
};
第一行,定义一个class,里面的run()函数内部维护着一个循环,可以用线程,或者定时器,或者中断用来接收外界信息。
第10行是C++程序的入口。
再看主程序,多次用到了LOG,这里没有明确定义,假设我们使用的是glog,用来输出日志。
然后调用app.run(),进行业务处理。
当run()退出的时候,整个程序结束,return 0通知系统。
这个就是最简单的C++工程框架了。想要实现什么功能,就在App的run()函数里实现。
这个程序和一般教科书上的Hello World不一样。还是最开始强调的,本文讲的是如果使用C++实现一个工程,就要按工程的标准来。本文先简单总结一下:1 main主程序启动后,不做具体工作,这些业务交给相关的业务class去实现。2 一定要有详尽的日志,越细越好。3 注释可有可无,但关键部分一定要加。本文是
伪代码,不加也看的懂,只是个演示。
=====================================
还是放上一个可编译的代码吧,cu的文件上传很不方便,代码放在github上:。
本章的内容在:
代码很简单,有一点经验就能看懂。考虑可能还有初学者,这里简单再讲解一下:
-
#include <iostream>// stl cout
-
#include <signal.h>//signal头文件
-
#include <chrono> //stl chrono头文件,时间工具,可以精确到,可以精确到纳秒
-
#include <thread> //stl thread
-
-
static int signaled = 0;
-
static void sigterm_handler(int sig)
-
{
-
signaled = 1;
-
}
-
-
class App
-
{
-
public:
-
void run()
-
{
-
//std::chrono::milliseconds可以是以下四个中的一个:seconds,milliseconds,microseconds,nanoseconds
-
uint64_t start_millseconds = std::chrono::duration_cast<std::chrono::milliseconds>
-
(std::chrono::system_clock::now().time_since_epoch()).count();
-
for (;;)
-
{
-
if (signaled == 1)
-
break;
-
else
-
{
-
std::cout << "运行毫秒数:" << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()).count()- start_millseconds << std::endl;
-
std::this_thread::sleep_for(std::chrono::seconds(1));;
-
}
-
}
-
};
-
};
-
-
-
int main()
-
{
-
std::cout << "Hello World!\n";
-
signal(SIGINT, sigterm_handler); //ctrl + c中断
-
-
-
App app;
-
app.run();
-
std::cout << "Exit!\n";
-
std::this_thread::sleep_for(std::chrono::seconds(1));
-
}
这段代码的作用是启动一个进程,然后一直循环,每隔一秒在屏幕上输出自启动开始的毫秒数。
在键盘上按ctrl+c时,屏幕上显示"Exit",然后一秒后正常退出进程。
程序启动退出和运行过程中有日志输出。
可以认为这是一个完整的C++程序框架,想要实现具体业务,就在App的run函数内处理。
代码里唯一有点陌生的是signal函数,监听系统中断事件。自行搜索一下就了解了。
本讲需要补充的地方:
1 程序运行中需要把日志保存到文件中
2 程序启动需要读配置文件
下一讲,先介绍一下glog的日志功能。
然后再讲一下json读写配置文件。
阅读(1723) | 评论(0) | 转发(0) |