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肯定是因为我自己的基础太差了,有待研究,哎。

 

好吧,杂谈一略有点多了,新开一个吧。

posted @ 2013-11-17 15:08  Allen_Tung  阅读(272)  评论(0编辑  收藏  举报