2014-11-24 128 views
0

我有一个要求,我的计时器必须根据2个条件进行重置,以先发生者为准。如何重新启动提升截止日期计时器

  1. 当计时器到期
  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; 
} 

此代码工作正常,直到时间计时器尚未取消。 一旦定时器被取消,定时器不能以预期的方式工作,它根本不起作用。

我在做什么错?

+0

你能否澄清你期望这个程序输出什么,它实际输出什么,以及为什么你认为这意味着定时器不工作? – 2014-11-24 08:10:12

回答

2

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

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"; 
} 

其次,当你取消计时器,离开了io_service对象没有任何工作,这意味着run_io_service线程将终止,让你没有服务。整个节目过程中保持服务活着,给它一个工作对象在主开始:

int main() { 
    boost::asio::io_service::work work(io); 
    ... 

和..如sehe提到的,你是不是安全处理的定时器(或std ::法院) 。当你打印重置信息并重置定时器时,你应该锁定mtx1,否则墨菲法则规定它可能在处理程序正在运行并且弄乱了事情的时刻发生。

+0

这是现货。 +1 – sehe 2014-11-24 08:24:22

2

您需要设置新的过期时间。

事实上,您不必在此事件中明确取消,因为设置新的期望会隐式取消任何待处理的异步等待。

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

+0

谢谢。处理错误帮助。 那么,每次我们需要重置计时器时,我们不需要停止io服务吗?在相同的定时器上使用async_wait会重置它? – garima721 2014-11-24 11:34:09

+0

不,是的。你可以随时查看文档。 (顺便提一下,'io_service'是线程安全的) – sehe 2014-11-24 11:52:39

+0

非常感谢。这解决了我的问题。 – garima721 2014-11-25 02:48:03