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

一、使用同步定时器

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




//makefile
#----------------------------------------------------------
#makefile helloworld测试用例
#
#
#
#
#-----------------------------------------------------------
ggg=g++
exe=asiotimer

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

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


#加入库文件
libso = -lboost_thread -lboost_system

$(exe):$(obj)
        @echo "链接开始................"
        $(ggg) $(libso) -o $(exe) $(obj)


hw.o : $(cpp)
        @echo "编译开始................"
        $(ggg) -std=c++11 -c $(cpp)



.PHONY : clean cleanall
cleanall:
        @echo "开始make all..........."
        -rm -rf $(exe) $(obj)

clean:
        @echo "开始清理................"
        -rm -rf $(obj)

2、asiotimer.h头文件

//asiotimer.h
#ifndef __ASIOTIMER__H__
#define __ASIOTIMER__H__
#include <iostream>
#include <boost/asio.hpp>
//#define BOOST_DATE_TIME_SOURCE
#include "boost/date_time/posix_time/posix_time.hpp"


#endif

3、asiotimer.cpp文件

//asiotimer.cpp
#include "asiotimer.h"
int main()
{
        boost::asio::io_service io;
        boost::asio::deadline_timer t(io,boost::posix_time::seconds(5));
        t.wait();

        std::cout<<"hello,world\n";
        return 0;
}

二、使用异步定时器示例

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

1、makefile文件

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

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

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


2、asiotest2.h

#ifndef __ASIOTEST2__H__
#define __ASIOTEST2__H__
#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
void print(const boost::system::error_code& );


#endif


3、asiotest2.cpp

#include "asiotest2.h"
using namespace std;
using namespace boost;

void print(const boost::system::error_code& )
{
        std::cout<<"hello,world!\n";
}
int main()
{
        boost::asio::io_service io;
        boost::asio::deadline_timer t(io,boost::posix_time::seconds(5));
        t.async_wait(&print);
        io.run();
        return 0;
}


三、绑定参数到处理程序

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

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


2、头文件

#ifndef __ASIOTEST3__H__
#define __ASIOTEST3__H__
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

#endif


3、CPP文件

#include "asiotest3.h"

void print(const boost::system::error_code&,
        boost::asio::deadline_timer* t,int* count)
{
        if(*count<5)
        {
                std::cout<<*count<<"\n";
                ++(*count);
                t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
                t->async_wait(boost::bind(print,
                        boost::asio::placeholders::error,t,count));
        }
}

int main()
{
        boost::asio::io_service io;
        int count=0;
        boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));
        t.async_wait(boost::bind(print,boost::asio::placeholders::error,
                        &t,&count));
        io.run();
        std::cout<<"Final count is" <<count<<"\n";
        return 0;
}


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

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


1、makefile 同上面示例

2、头文件

#ifndef __ASIOTEST4__H__
#define __ASIOTEST4__H__
#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class printer
{
public:
        printer(boost::asio::io_service& io)
                :timer_(io,boost::posix_time::seconds(1)),
                count_(0)
        {
                timer_.async_wait(boost::bind(&printer::print,this));
        }
        ~printer()
        {
                std::cout<<"Final count is "<<count_<<"\n";
        }

        void print()
        {
                if(count_<5)
                {
                        std::cout<<count_<<std::endl;
                        ++count_;

                        timer_.expires_at(timer_.expires_at()+boost::posix_time::seconds(1));
                        timer_.async_wait(boost::bind(&printer::print,this));
                }
        }
private:
        boost::asio::deadline_timer timer_;
        int count_;

};

3、cpp文件

#include "asiotest4.h"
int main()
{
        boost::asio::io_service io;
        printer p(io);
        io.run();
        return 0;
}

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

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

1、makefile同上

2、头文件

#ifndef __ASIOTEST5__H__
#define __ASIOTEST5__H__
#include <iostream>
#include <boost/asio.hpp>
#include <boost/thread/thread.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

class printer
{
public:
        printer(boost::asio::io_service& io):strand_(io),
                timer1_(io,boost::posix_time::seconds(1)),
                timer2_(io,boost::posix_time::seconds(1)),count_(0)
        {
                timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1,this)));
                timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2,this)));
        }
        ~printer()
        {
                std::cout<<"Final count is " <<count_<<std::endl;
        }

        void print1()
        {
                if(count_ < 10)
                {
                        std::cout<<"Timer 1: "<<count_<<std::endl;
                        ++count_;

                        timer1_.expires_at(timer1_.expires_at() + boost::posix_time::seconds(1));
                        timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1,this)));

                }
        }

        void print2()
        {

                if(count_ < 10)
                {
                        std::cout<<"Timer 2: " <<count_<<std::endl;
                        ++count_;
                        timer2_.expires_at(timer2_.expires_at() + boost::posix_time::seconds(1));
                        timer2_.async_wait(strand_.wrap(boost::bind(&printer::print2,this)));

                }
        }
private:
        boost::asio::strand strand_;
        boost::asio::deadline_timer timer1_;
        boost::asio::deadline_timer timer2_;
        int count_;
};

#endif 


3、CPP文件

#include "asiotest5.h"
int main()
{
  boost::asio::io_service io;
  printer p(io);
  boost::thread t(boost::bind(&boost::asio::io_service::run,&io));
  io.run();
  t.join();
  return 0;
}







  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值