gflags用法与boost异步I/O服务经典示例

本文介绍gflags命令行参数解析工具和Boost库在C++项目中的应用,演示了gflags参数定义与检查、Boost异步服务及定时器功能,通过实例展示了类间回调的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(第一次从项目中接触这类知识,还是挺好奇,于是自己写了一段)

gflags是google的一套开源命令行参数解析工具,在工程化的开发当中经常用到,其安装可以参考网上,下面仅演示gflags的参数定义、参数检查、参数传入。

boost是是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一。c++标准一直都在变,现在c++11用得比较多,但以前的工程里一直还是习惯使用boost,所以要看懂以前的代码,boost还是要看一下的,下面演示了boost异步服务,通过定时器实现定时输出功能,并实现了类之间的回调。

#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include "gflags/gflags.h"
#include <iostream>


static int second = 0;
boost::shared_mutex myMutex;
//定义等待时间
DEFINE_int32(timer_wait_second,2,"wait time in seconds");

class myClass
{
public:
	myClass() :myAge(20), myName("alpc40") {}
	bool setAgeName(const int age, const std::string name) {
		myAge = age;
		myName = name;
		return true;
	}
	void outAgeName() {
		std::cout << myAge << " " << myName <<std::endl;
	}

private:
	int myAge;
	std::string myName;
};


class cls
{
	//定义回调形式,与myClass相关
	using callBack = std::function<bool(const int, const std::string)>;
	using printCallBack = std::function<void(void)>;
public:
	cls();
	~cls();
	void print(const boost::system::error_code &ec);
	void RegisteUserCallBack(callBack call_back);
	void RegistePrintCallBack(printCallBack call_back);
private:
	boost::asio::io_service io_service;
	boost::asio::deadline_timer timer;
	boost::thread* thread;
	callBack my_call_back;
	printCallBack my_print_call_back;
};
//回调函数
void cls::RegistePrintCallBack(printCallBack call_back)
{
	my_print_call_back = call_back;
}
//回调函数
void cls::RegisteUserCallBack(callBack call_back)
{
	my_call_back = call_back;
}

cls::cls() : timer(io_service, boost::posix_time::seconds(FLAGS_timer_wait_second)) {
	//timer绑定函数,即当timer结束后,才启动该函数
	timer.async_wait(boost::bind(&cls::print, this, boost::asio::placeholders::error));
	thread = new boost::thread([&] {
		//io_service开始工作,这个时候timer才开始启动
		boost::asio::io_service::work work(io_service);
		//异步阻塞,直到work完成才能结束
		io_service.run();
	});
}

cls::~cls() {
	//释放时先取消定时器
	timer.cancel();
	//取消异步IO服务
	io_service.stop();
	//取消线程
	if (thread != nullptr) {
		//线程阻塞,直到thread运行完毕
		thread->join();
		delete thread;
		thread = nullptr;
	}
}

void cls::print(const boost::system::error_code &ec)
{
	printf("%d s\n", ++second);
	//使用锁,写myClass类
	boost::unique_lock<boost::shared_mutex> _(myMutex);
	my_call_back(second, "haha");
	my_print_call_back();
	if (second < 8)
	{
		//使timer重新激发,继续运行
		timer.expires_from_now(boost::posix_time::seconds(FLAGS_timer_wait_second));
		timer.async_wait(boost::bind(&cls::print, this, boost::asio::placeholders::error));
	}
	
}
//参数赋值检测函数,使1<FLAGS_timer_wait_second< 60
static bool validateTimer(const char *name, int32_t second)
{
	if (second > 60 || second < 1)
		return false;
	return true;
}

int main(int argc,char **argv)
{
	//注册参数赋值检测函数
	gflags::RegisterFlagValidator(&FLAGS_timer_wait_second, &validateTimer);
	//参数来自输入,自行赋值给FLAGS
	gflags::ParseCommandLineFlags(&argc, &argv, true);
	//定义两个类
	myClass heihei;
	cls haha;
	//注册函数,也就是说,在haha类当中可以调用heihei类,使heihei类进行改变
	haha.RegisteUserCallBack(std::bind(&myClass::setAgeName, &heihei, std::placeholders::_1, std::placeholders::_2));
	haha.RegistePrintCallBack(std::bind(&myClass::outAgeName, &heihei));
	while (1)
	{
		Sleep(1000);
		//获得主线程ID
		std::cout << boost::this_thread::get_id() << ":";
		//获得锁,防止输出时输入
		boost::unique_lock<boost::shared_mutex> _(myMutex);
		heihei.outAgeName();
	}
	return 0;
}

可以运行下,看看效果与自己的期望是不是一样,还是挺有意思的

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值