asio-异步编译错误

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


void print(const boost::system::error_code  &e,
           boost::asio::deadline_timer* t,  int *count)
{
    if ( *count < 5)
    {
        std::cout << *count << " ";
        ++(*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 << std::endl;

    return 0;

}

将上面的内容(asio官方的异步timer教程)在vs2005下编译时会出现一个错误,该错误是一个包含windows.h头文件的错误,虽然我们没有编写包含windows.h头文件的申明,但是asio库中的microsec_time_clock.hpp头文件包含了windows.h头文件,因此修改此方案的方式在包含windows.h头文件的前面写一个宏定义:

#ifdef BOOST_HAS_FTIME
#define WIN32_LEAN_AND_MEAN             // 这一行是后来添加进去的
#include <windows.h>
#endif

此时,再次编译,有可能会出现无法找到libboost_date_time-vc80-mt-s-1_35.lib库文件,修改的方案是将libboost_date_time-vc80-mt-1_35.lib库文件复制一份,然后命名为libboost_date_time-vc80-mt-s-1_35.lib,至于为什么这样做是可以的,我也不是很清楚。

再次编译,可能还会出现找不到libboost_system-vc80-mt-s-1_35.lib库文件的错误,同上面的,将libboost_system-vc80-mt-1_35.lib库文件更名为libboost_system-vc80-mt-s-1_35.lib。


说明:
  1、vc80 -- 即表示vs2005
  2、如果你没有上面的库,那么google一下,如何编译boost库,google上面很多很多。既然要用boost,免不了需要编译部分boost库,如何编译仅需要的库我还没有学会,因此不要问我啦!
  3、希望该记录能够为那些碰到类似问题的网友提供一个抛砖引玉的方法。
 
参考:
 关于windows.h头文件错误的提问:
      http://www.nabble.com/WinSock.h-has-already-been-included-td18329342.html

后记:
  后来还给出了另外一种实现方式,但是编译时发现较多错误,因此也在这边记录下来。

#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<void>( boost::mem_fn(&printer::print),this));
       // _timer.async_wait( boost::bind( &printer::print,this) ); //编译错误,修改为上面方式即可
    }

    ~printer()
    {
        std::cout << "Final count is " << _count << " " << std::endl;
    }
    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<void>(boost::mem_fn(&printer::print), this));
      // _timer.async_wait( boost::bind( &printer::print,this) ); //编译错误,修改为上面方式即可

        }
    }
protected:
private:
    boost::asio::deadline_timer _timer;
    int    _count;
};

int main()
{
    //boost::asio:io_service io;
    boost::asio::io_service io;
    printer p(io);
    io.run();

    return 0;
}


转载于:https://www.cnblogs.com/ubunoon/archive/2008/09/09/Boost_Asio_Async_Timer.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值