C++ 如何重新启动boost截止时间计时器

C++ 如何重新启动boost截止时间计时器,c++,boost-asio,C++,Boost Asio,我有一个要求,我的计时器必须根据2个条件重置,以较早发生的为准 计时器到期时 当满足特定条件时(如内存达到特定限制) 我将采取以下步骤: boost::asio::io_service io; boost::asio::deadline_timer t(io, boost::posix_time::seconds(1)); boost::mutex mtx1; void run_io_service() { io.run(); } void print(const boost::sy

我有一个要求,我的计时器必须根据2个条件重置,以较早发生的为准

  • 计时器到期时
  • 当满足特定条件时(如内存达到特定限制)
  • 我将采取以下步骤:

    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
    boost::mutex mtx1;
    
    void run_io_service()
    {
        io.run();
    }
    
    void print(const boost::system::error_code& /*e*/)
    {
        boost::mutex::scoped_lock lock(mtx1);
        std::cout << "Hello, world!\n";
        t.expires_from_now(boost::posix_time::seconds(1));
        t.async_wait(print);
        std::cout << "Print executed\n";
    }
    int main()
    {
        t.async_wait(print);
        boost::thread monitoring_thread = boost::thread(run_io_service);
        boost::this_thread::sleep( boost::posix_time::seconds(2));
        t.cancel();
        std::cout << "Resetting Timer\n";
        t.async_wait(print);
        boost::this_thread::sleep( boost::posix_time::seconds(2));
        t.cancel();
        io.stop();
        monitoring_thread.join();
        return 0;
    }
    
    boost::asio::io\u服务io;
    boost::asio::deadline_timer t(io,boost::posix_time::seconds(1));
    boost::互斥mtx1;
    无效运行io_服务()
    {
    io.run();
    }
    无效打印(常量boost::system::error\u code&/*e*/)
    {
    boost::mutex::作用域锁定(mtx1);
    
    std::cout您需要设置一个新的过期时间

    事实上,在这个事件中,您不必显式取消,因为设置新的experation会隐式取消任何挂起的异步等待


    请记住,虽然deadline\u timer对象本身不是线程安全的,因此您需要保持计时器的同步。

    您需要设置一个新的过期时间

    事实上,在这个事件中,您不必显式取消,因为设置新的experation会隐式取消任何挂起的异步等待


    请记住,虽然deadline_timer对象本身不是线程安全的,因此您需要保持计时器的同步。

    第一个问题是,如果出现错误(如被取消),仍将调用处理程序,您需要检查错误代码

    void print(const boost::system::error_code& e )
    {
        if( e ) return; // we were cancelled
        // actual error code for cancelled is boost::asio::error::operation_aborted
    
        boost::mutex::scoped_lock lock(mtx1);
        std::cout << "Hello, world!\n";
        t.expires_from_now(boost::posix_time::seconds(1));
        t.async_wait(print);
        std::cout << "Print executed\n";
    }
    

    和..正如sehe所提到的,您没有安全地处理计时器(或std::cout)。打印重置消息和重置计时器时,应锁定mtx1,否则墨菲定律规定它可能发生在处理程序运行的确切时刻,并将事情搞砸。

    第一个问题是,如果出现错误(如被取消),仍将调用处理程序,您需要检查错误代码

    void print(const boost::system::error_code& e )
    {
        if( e ) return; // we were cancelled
        // actual error code for cancelled is boost::asio::error::operation_aborted
    
        boost::mutex::scoped_lock lock(mtx1);
        std::cout << "Hello, world!\n";
        t.expires_from_now(boost::posix_time::seconds(1));
        t.async_wait(print);
        std::cout << "Print executed\n";
    }
    

    和..正如sehe所提到的,您没有安全地处理计时器(或std::cout)。打印重置消息并重置计时器时,您应该锁定mtx1,否则墨菲定律规定它可能发生在处理程序运行的确切时刻,并将事情搞砸。

    您能否澄清此程序预期输出的内容、实际输出的内容,以及您认为这意味着计时器不工作的原因?您能否澄清你期望这个程序输出什么,它实际输出什么,以及为什么你认为这意味着计时器不工作?谢谢。处理错误有帮助。所以,我们不需要每次需要重置计时器时都停止io服务吗?只需在同一个计时器上使用async_wait重置它?不,是的。你可以随时查看文档。(
    io\u服务
    是线程安全的,顺便说一句)谢谢。处理错误很有帮助。所以,我们不需要每次需要重置计时器时都停止io服务吗?只需使用async\u等待相同的计时器就可以重置它吗?不,是的。您可以随时查看文档。(
    io\u服务
    是线程安全的,顺便说一下)