boost asio 杂谈(一)
没办法,因为太水,勤能补拙吧,点点滴滴来学吧,asio库的东西:
第一:关于timer的一点小知识,
void print(const boost::system::error_code& err_code) { cout<<"Hello Allen!\n"; } int main() { int forcin=0; boost::asio::io_service io_service; boost::asio::deadline_timer temp_timer(io_service, boost::posix_time::seconds(30)); temp_timer.async_wait(&print); time_t temp_time = time(0); for(int k = 0; k < 10; k++) { temp_time = time(0); cout<<ctime(&temp_time)<<endl; Sleep(2000); } io_service.run(); temp_time = time(0); cout<<ctime(&temp_time)<<endl;
上面这段代码其实就是生成一个计时器,传入的参数当然要有一个io_service和一个等待的秒数,接下来就是指定它等待完之后要执行什么动作,也就是print的这个函数,然后其实就是滞后30秒之后当遇到io_service的run的时候就会执行了,但要注意的是,这其他要有其他的东西干,不然的话它就会立即执行,像这里我中间加了一个for循环,总共需要20秒,所以执行完这个for循环后再等10秒就会执行那个print函数了。
然后关于第三个基本例子,那个asyn timer的那个,基本思想跟前面的差不度,只不过多了个bind,来解释下这个bind有什么用,其实就是绑定一个函数,跟着是要传进这个函数的参数,然后是遇到了expire_at这个参数,它就是获取这个timer原本被定再了哪个时刻就停止的,然后反正这样的代码是能得到以下的结果的,我是想明白它那个作用了的,何时执行何时其实是overlapping了一下后就要马上执行了,从那个输出allen一起的前两个就知道了,仅供自己记录了:
void print(const boost::system::error_code& err_code, boost::asio::deadline_timer* t, int* count) { if(*count < 5) { time_t tt = time(0); cout<<"Hello Allen!\n"; cout<<ctime(&tt)<<endl; (*count)++; t->expires_at(t->expires_at() + boost::posix_time::seconds(2)); t->async_wait(boost::bind(print, boost::asio::placeholders::error, t, count)); } } int main() { int forcin=0; time_t temp_time = time(0); int count = 0; boost::asio::io_service io_service; //boost::asio::deadline_timer temp_timer(io_service, boost::posix_time::seconds(30)); boost::asio::deadline_timer temp_timer(io_service, boost::posix_time::seconds(15)); temp_timer.async_wait(boost::bind(print, boost::asio::placeholders::error, &temp_timer, &count)); for(int k = 0; k < 10; k++) { temp_time = time(0); cout<<ctime(&temp_time)<<endl; if(k != 9) Sleep(2000); } io_service.run(); cout<<ctime(&temp_time)<<endl; cin>>forcin;
然后又去学了最后一个关于使用strand类的这么一个保证线程安全,也就是使用同一个strand对象来wrap过的两个计时器不会发生conflict的这么一个机制,可能这个例子不够复杂吧,反正我没用这个对象来wrap一下,跑出来的结果也还是没有conflict,然后让我有点confused的是io_service.run()这个函数,我注释掉这行之后,之前的async_wait的timer等够了时间之后也还是该干嘛干嘛的啊!输出完全正常,而且还有thread。join这个函数,到底用来干嘛啊,好吧,第二个小的confusion肯定是因为我自己的基础太差了,有待研究,哎。
好吧,杂谈一略有点多了,新开一个吧。