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

    一、使用同步定时器

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

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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 ";  
    10.         return 0;  
    11. }  

    二、使用异步定时器示例

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

    1、makefile文件

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

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

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

    2、asiotest2.h

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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! ";  
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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<<" ";  
    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<<" ";  
    25.         return 0;  
    26. }  

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

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

    1、makefile 同上面示例

    2、头文件

    [cpp] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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_<<" ";  
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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在CODE上查看代码片派生到我的代码片
     
    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. }
        from:
    http://blog.csdn.net/leitianjun/article/details/25740633
  • 相关阅读:
    好看的滚动条样式
    mysql常用语句
    实现点击左边菜单,然后右边弹出网页内容。
    封装一个tab思想方法实现点击的时候显示或隐藏效果
    JS对话框_JS模态对话框showModalDialog用法总结
    登录框
    git分支介绍和常用操作
    git 撤销删除恢复某次提交记录
    charles导出请求-转换格式应用至postman
    git工作流及提交操作
  • 原文地址:https://www.cnblogs.com/lidabo/p/4022710.html
Copyright © 2011-2022 走看看