c++ - boost deadline_timer 不等待

标签 c++ boost boost-asio deadline-timer

我尝试在这个简单的测试应用程序中使用 boost deadline_timer,但遇到了一些麻烦。目标是使用 deadline_timerexpires_at() 成员函数让计时器每 45 毫秒触发一次。 (我需要一个绝对时间,所以我不考虑 expires_from_now()。我现在也不关心漂移)。当我运行程序时,wait() 没有等待 45 毫秒!然而,没有报告错误。我是否以某种方式错误地使用了库?

示例程序:

#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
using namespace std;

int main()
{
        boost::asio::io_service Service;
        boost::shared_ptr<boost::thread> Thread;
        boost::asio::io_service::work RunForever(Service);
        Thread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&boost::asio::io_service::run, &Service)));
        boost::shared_ptr<boost::asio::deadline_timer> Timer(new boost::asio::deadline_timer(Service));

        while(1)
        {
                boost::posix_time::time_duration Duration;
                Duration = boost::posix_time::microseconds(45000);
                boost::posix_time::ptime Start = boost::posix_time::microsec_clock::local_time();
                boost::posix_time::ptime Deadline = Start + Duration;
                boost::system::error_code Error;
                size_t Result = Timer->expires_at(Deadline, Error);
                cout << Result << ' ' << Error << ' ';
                Timer->wait(Error);
                cout << Error << ' ';
                boost::posix_time::ptime End = boost::posix_time::microsec_clock::local_time();
                (cout << "Duration = " << (End - Start).total_milliseconds() << " milliseconds" << endl).flush();
        }
        return 0;
}

最佳答案

您将本地时间与系统时间混合在一起。 asio 将您的本地时间与之进行比较的时间很可能是您希望将截止日期设置为等待立即返回的时间之后的几个小时(取决于您居住的地方;同样的代码也可以等待几个小时)。为了避免这一点的混淆,绝对时间应该从 asio::time_traits 派生。

#include <boost/asio.hpp>
#include <boost/asio/time_traits.hpp>
#include <boost/thread.hpp> 
#include <boost/bind.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <iostream> 
using namespace std;

typedef boost::asio::time_traits<boost::posix_time::ptime> time_traits_t;  
int main() {         
    boost::asio::io_service Service;         
    boost::shared_ptr<boost::thread> Thread;         
    boost::asio::io_service::work RunForever(Service);         
    Thread = boost::shared_ptr<boost::thread>(new boost::thread(boost::bind(&boost::asio::io_service::run, &Service)));
    boost::shared_ptr<boost::asio::deadline_timer> Timer(new boost::asio::deadline_timer(Service));          
    while(1)         
    {                 
        boost::posix_time::time_duration Duration;
        Duration = boost::posix_time::microseconds(45000);
        boost::posix_time::ptime Start = time_traits_t::now();
        boost::posix_time::ptime Deadline = Start + Duration;
        boost::system::error_code Error;
        size_t Result = Timer->expires_at(Deadline, Error);
        cout << Result << ' ' << Error << ' ';
        Timer->wait(Error);
        cout << Error << ' ';
        boost::posix_time::ptime End = boost::posix_time::microsec_clock::local_time();
        (cout << "Duration = " << (End - Start).total_milliseconds() << " milliseconds" << endl).flush();
     }         
    return 0; 
}

在这种情况下,这应该适合您。

关于c++ - boost deadline_timer 不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5384753/

相关文章:

python - 在 Boost Python 中公开模板化基类的最佳方式?

c++ - 向现有多索引容器添加更多索引

boost-asio - boost.asio组合操作在strand中运行

c++ - C++传递参数时 "small object"的定义

c++ - valgrind 在使用 https 时报告 libcurl 的问题

c++ - Boost Log 清除日志文件

multithreading - 何时在 asio 中使用异步操作

c++ - 无法获取派生类成员的值

c++ - 正则表达式匹配 Unicode 'Punctuation' 类别 c++

networking - boost::asio tcp async_accept 处理程序未被调用但同步连接工作正常