boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等

一、使用同步定时器

这个示例程序通过展示如何在一个定时器执行一个阻塞等待。

 

 

 

[cpp] view plaincopy

 

  1. //makefile  
  2. #----------------------------------------------------------  
  3. #makefile helloworld测试用例  
  4. #  
  5. #  
  6. #  
  7. #  
  8. #-----------------------------------------------------------  
  9. ggg=g++  
  10. exe=asiotimer  
  11.   
  12. #所有的.o文件写在这里  
  13. obj = asiotimer.o  
  14.   
  15. #所要关联的cpp文件写在这里  
  16. cpp = asiotimer.cpp  
  17.   
  18.   
  19. #加入库文件  
  20. libso = -lboost_thread -lboost_system  
  21.   
  22. $(exe):$(obj)  
  23.         @echo "链接开始................"  
  24.         $(ggg) $(libso) -o $(exe) $(obj)  
  25.   
  26.   
  27. hw.o : $(cpp)  
  28.         @echo "编译开始................"  
  29.         $(ggg) -std=c++11 -c $(cpp)  
  30.   
  31.   
  32.   
  33. .PHONY : clean cleanall  
  34. cleanall:  
  35.         @echo "开始make all..........."  
  36.         -rm -rf $(exe) $(obj)  
  37.   
  38. clean:  
  39.         @echo "开始清理................"  
  40.         -rm -rf $(obj)  

2、asiotimer.h头文件

[cpp] view plaincopy

 

  1. //asiotimer.h  
  2. #ifndef __ASIOTIMER__H__  
  3. #define __ASIOTIMER__H__  
  4. #include <iostream>  
  5. #include <boost/asio.hpp>  
  6. //#define BOOST_DATE_TIME_SOURCE  
  7. #include "boost/date_time/posix_time/posix_time.hpp"  
  8.   
  9.   
  10. #endif  

3、asiotimer.cpp文件

 

[cpp] view plaincopy

 

  1. //asiotimer.cpp  
  2. #include "asiotimer.h"  
  3. int main()  
  4. {  
  5.         boost::asio::io_service io;  
  6.         boost::asio::deadline_timer t(io,boost::posix_time::seconds(5));  
  7.         t.wait();  
  8.   
  9.         std::cout<<"hello,world\n";  
  10.         return 0;  
  11. }  

 

 

 

 

二、使用异步定时器示例

本示例程序演示了如何使用Asio的异步回调功能由示例一修改程序 ,开启计时器执行一个异步等待。

1、makefile文件

makefile 与示例一基本相同,只需要修改
exe=asiotest2

#所有的.o文件写在这里
obj = asiotest2.o

#所要关联的cpp文件写在这里
cpp = asiotest2.cpp

 

2、asiotest2.h

 

[cpp] view plaincopy

 

  1. #ifndef __ASIOTEST2__H__  
  2. #define __ASIOTEST2__H__  
  3. #include <iostream>  
  4. #include <boost/asio.hpp>  
  5. #include <boost/date_time/posix_time/posix_time.hpp>  
  6. void print(const boost::system::error_code& );  
  7.   
  8.   
  9. #endif  

 

 

 

 

 

3、asiotest2.cpp

 

[cpp] view plaincopy

 

  1. #include "asiotest2.h"  
  2. using namespace std;  
  3. using namespace boost;  
  4.   
  5. void print(const boost::system::error_code& )  
  6. {  
  7.         std::cout<<"hello,world!\n";  
  8. }  
  9. int main()  
  10. {  
  11.         boost::asio::io_service io;  
  12.         boost::asio::deadline_timer t(io,boost::posix_time::seconds(5));  
  13.         t.async_wait(&print);  
  14.         io.run();  
  15.         return 0;  
  16. }  

 

 

 

 

 

三、绑定参数到处理程序

在本示例中,我们将在示例二修改程序,使定时器每秒被激活一次。这将显示如何传递额外的参数给你的处理函数。

1、makefile 文件同示例二makefile修改方法

 

2、头文件

 

[cpp] view plaincopy

 

  1. #ifndef __ASIOTEST3__H__  
  2. #define __ASIOTEST3__H__  
  3. #include <iostream>  
  4. #include <boost/asio.hpp>  
  5. #include <boost/bind.hpp>  
  6. #include <boost/date_time/posix_time/posix_time.hpp>  
  7.   
  8. #endif  

 

 

 

 

 

3、CPP文件

 

[cpp] view plaincopy

 

  1. #include "asiotest3.h"  
  2.   
  3. void print(const boost::system::error_code&,  
  4.         boost::asio::deadline_timer* t,int* count)  
  5. {  
  6.         if(*count<5)  
  7.         {  
  8.                 std::cout<<*count<<"\n";  
  9.                 ++(*count);  
  10.                 t->expires_at(t->expires_at() + boost::posix_time::seconds(1));  
  11.                 t->async_wait(boost::bind(print,  
  12.                         boost::asio::placeholders::error,t,count));  
  13.         }  
  14. }  
  15.   
  16. int main()  
  17. {  
  18.         boost::asio::io_service io;  
  19.         int count=0;  
  20.         boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));  
  21.         t.async_wait(boost::bind(print,boost::asio::placeholders::error,  
  22.                         &t,&count));  
  23.         io.run();  
  24.         std::cout<<"Final count is" <<count<<"\n";  
  25.         return 0;  
  26. }  

 

 

 

 

 

四、使用成员函数做为处理程序示例

在本示例中,我们将看到如何使用一个类的成员函数作为回调处理程序。

 

1、makefile 同上面示例

2、头文件

 

[cpp] view plaincopy

 

  1. #ifndef __ASIOTEST4__H__  
  2. #define __ASIOTEST4__H__  
  3. #include <iostream>  
  4. #include <boost/asio.hpp>  
  5. #include <boost/bind.hpp>  
  6. #include <boost/date_time/posix_time/posix_time.hpp>  
  7.   
  8. class printer  
  9. {  
  10. public:  
  11.         printer(boost::asio::io_service& io)  
  12.                 :timer_(io,boost::posix_time::seconds(1)),  
  13.                 count_(0)  
  14.         {  
  15.                 timer_.async_wait(boost::bind(&printer::print,this));  
  16.         }  
  17.         ~printer()  
  18.         {  
  19.                 std::cout<<"Final count is "<<count_<<"\n";  
  20.         }  
  21.   
  22.         void print()  
  23.         {  
  24.                 if(count_<5)  
  25.                 {  
  26.                         std::cout<<count_<<std::endl;  
  27.                         ++count_;  
  28.   
  29.                         timer_.expires_at(timer_.expires_at()+boost::posix_time::seconds(1));  
  30.                         timer_.async_wait(boost::bind(&printer::print,this));  
  31.                 }  
  32.         }  
  33. private:  
  34.         boost::asio::deadline_timer timer_;  
  35.         int count_;  
  36.   
  37. };  

 

 

3、cpp文件

 

[cpp] view plaincopy

 

  1. #include "asiotest4.h"  
  2. int main()  
  3. {  
  4.         boost::asio::io_service io;  
  5.         printer p(io);  
  6.         io.run();  
  7.         return 0;  
  8. }  

 

 

 

五、多线程的同步处理示例

本示例演示boost::asio::strand 在多线程程序中同步回调处理程

1、makefile同上

2、头文件

 

[cpp] view plaincopy

 

  1. #ifndef __ASIOTEST5__H__  
  2. #define __ASIOTEST5__H__  
  3. #include <iostream>  
  4. #include <boost/asio.hpp>  
  5. #include <boost/thread/thread.hpp>  
  6. #include <boost/bind.hpp>  
  7. #include <boost/date_time/posix_time/posix_time.hpp>  
  8.   
  9. class printer  
  10. {  
  11. public:  
  12.         printer(boost::asio::io_service& io):strand_(io),  
  13.                 timer1_(io,boost::posix_time::seconds(1)),  
  14.                 timer2_(io,boost::posix_time::seconds(1)),count_(0)  
  15.         {  
  16.                 timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1,this)));  
  17.                 timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2,this)));  
  18.         }  
  19.         ~printer()  
  20.         {  
  21.                 std::cout<<"Final count is " <<count_<<std::endl;  
  22.         }  
  23.   
  24.         void print1()  
  25.         {  
  26.                 if(count_ < 10)  
  27.                 {  
  28.                         std::cout<<"Timer 1: "<<count_<<std::endl;  
  29.                         ++count_;  
  30.   
  31.                         timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));  
  32.                         timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1,this)));  
  33.   
  34.                 }  
  35.         }  
  36.   
  37.         void print2()  
  38.         {  
  39.   
  40.                 if(count_ < 10)  
  41.                 {  
  42.                         std::cout<<"Timer 2: " <<count_<<std::endl;  
  43.                         ++count_;  
  44.                         timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));  
  45.                         timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2,this)));  
  46.   
  47.                 }  
  48.         }  
  49. private:  
  50.         boost::asio::strand strand_;  
  51.         boost::asio::deadline_timer timer1_;  
  52.         boost::asio::deadline_timer timer2_;  
  53.         int count_;  
  54. };  
  55.   
  56. #endif   

 

 

 

3、CPP文件

 

[cpp] view plaincopy

 

  1. #include "asiotest5.h"  
  2. int main()  
  3. {  
  4.   boost::asio::io_service io;  
  5.   printer p(io);  
  6.   boost::thread t(boost::bind(&boost::asio::io_service::run,&io));  
  7.   io.run();  
  8.   t.join();  
  9.   return 0;  
  10. }
    1. from:

http://blog.csdn.net/leitianjun/article/details/25740633

时间: 2024-10-30 22:14:55

boost库学习随记六:使用同步定时器、异步定时器、bind、成员函数回调处理、多线程的同步处理示例等的相关文章

同步~异步~阻塞~非阻塞

原文地址:同 步 和 异 步作者:zenos   一.同步-异步-阻塞-非阻塞     同步(Synchronous)和异步(Asynchronous)的概念本来来自通信领域:首先是通信的同步,主要是指客户端在发送请求后,必须得在服务端有回应后才发送下一个请求,所以这个时候的所有请求将会在服务端得到同步:其次是通信的异步,指客户端在发送请求后,不必等待服务端的回应就可以发送下一个请求,这样对于所有的请求动作来说将会在服务端得到异步,这条请求的链路就像是一个请求队列,所有的动作在这里不会得到同步的

shared ptr可以从boost库中单独提出来吗

问题描述 shared ptr可以从boost库中单独提出来吗 50C 因为最近开发需要,想在一个平台上移植代码,但是代码中应用了大量的shared ptr,但是移植代码的时候不想把整个boost库移植,只想移植shared ptr相关,有什么办法吗?还是需要一个文件一个文件的分离出来? 解决方案 只能一个个头文件隔离,主要取决于它的依赖项.估计有点多,不是那么容易抽取出来 解决方案二: 这个要找库大神了,不过即使可行,也不划算的啊 解决方案三: shared ptr是boost中的基本类型,涉

VS2010 编译安装boost库

实践是最好的办法..学习C++,想试试线程,然后打算用boost库,结果boost库编译差点吓到我..没看到比较完整的安装教程..一直耽搁.今天动手.完成了.方法记录如下:1.下载boost从boost官网( http://www.boost.org )上下载最新的boost版本,现在最新是1.49版本,解压到自定义目录(我解压到了D:/program files,最终的目录结构是D:\Program Files\boost_1_49_0) 2.编译安装 在D:\Program Files\bo

boost-为什么Boost库的搜索函数明显比std的search慢?

问题描述 为什么Boost库的搜索函数明显比std的search慢? 在学习boost的时候测试了一下boost的algorithm中的三个search函数,分别是Boyer-Moore Search,Boyer-Moore-Horspool Search,Knuth-Morris-Pratt Search,同时也测试了std的search函数,测试的结果有点意外,std的search花的时间比前面三个快了两个数量级,问题出在哪儿?测试的代码如下: #define _CRT_SECURE_NO_

Boost库在Windows平台下的编译

最近正在学习Boost库,过一久要用它来进行一些跨平台的开发:使用thread线程库来开发多线程 的程序(就是我的那个CodingWar项目:-P),所以自己动手进行了下面的Boost配置编译工作. 一.编译前的准备 我的VC++2005安装在"D:\Microsoft Visual Studio 8\VC"目录:下载boost库后解压, 根目录为:"D:\C_C++\boost_1_33_1",可参考改为相应的目录即可. 二.编译步骤 1.执行:"D:\

c++-C++ 时间调用除了boost库还有什么第三方

问题描述 C++ 时间调用除了boost库还有什么第三方 在做C++的项目过程中,原来对于时间的处理部分直接调用了Boost库中提供的gregorian和posix_time命名空间中的方法.现在由于某些方面的原因,需要解除对boost库的依赖.请问除了调用c++基本库中的方法有什么其他的可用第三方时间调用库吗? 解决方案 既然要用其它第三方,为啥不选boost 解决方案二: boost稍显庞大,工程需要多平台支持.boost多个平台需要分别编译对应的版本.出现错误,调试起来也比较麻烦 解决方案

VS2008下直接安装使用Boost库1.46.1版本

 Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容.在C++社区中影响甚大,是不折不扣的"准"标准库. Boost由于其对跨平台的强调,对标准C++的强调,与编写平台无关.大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库.但Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎.boos

c++-用boost库实现socket编程,遇到几个问题,求大神指导

问题描述 用boost库实现socket编程,遇到几个问题,求大神指导 boost::asio::socket_base::bytes_readable command(true); socket_.io_control(command); 上面这段代码是干什么用的啊?? 还有socket_.read_some() ,boost::asio::async_read(),这两个函数有什么区别啊 解决方案 google socket控制 socket的读,异步读 解决方案二: http://stac

C++中Boost库裁剪与其应用详解_C 语言

前言 Boost 库涵盖的范围极广,有字符串和文本处理相关子库比如 format 库和 regexp 库,有容器相关子库比如 variant 库(和 Qt 的 QVariant 有得一拼),有迭代器子库比如 tokenizer 库(可以把字符进行 tokenize),还有算法.函数对象和高阶编程相关子库如functional 库.lambda 库和 signal 库,还有泛型编程.模板编程子库如 call traits.mpl,还有并发编程相关的 thread 库,等等等等. Boost 是如此