2012-07-28 66 views
2

下面是一个用定时器封装线程的测试类的实现。 奇怪的是,如果截止日期设置为500毫秒,它可以工作,但如果我将其设置为1000毫秒,则不会。我究竟做错了什么?boost deadline_timer issue

#include "TestTimer.hpp" 
#include "../SysMLmodel/Package1/Package1.hpp" 

TestTimer::TestTimer(){ 
    thread = boost::thread(boost::bind(&TestTimer::classifierBehavior,this)); 
    timer = new  boost::asio::deadline_timer(service,boost::posix_time::milliseconds(1000)); 
    timer->async_wait(boost::bind(&TestTimer::timerBehavior, this)); 


}; 

TestTimer::~TestTimer(){ 
} 

void TestTimer::classifierBehavior(){ 
service.run(); 
}; 


void TestTimer::timerBehavior(){ 
std::cout<<"timerBehavior\r"; 
timer->expires_at(timer->expires_at() + boost::posix_time::milliseconds(1000)); 
timer->async_wait(boost::bind(&TestTimer::timerBehavior,this)); 
} 

UPDATE 1 我已经注意到,程序stucks(或至少标准输出在控制台许多秒,约30),那么大量的“timerBehavior”字符串一起打印出来,如果他们已经在某个地方排队了。

+0

你应该确保,你的服务没有失去工作。没有任何东西阻止线程先启动并运行service.run()一次。然后在线程失效后,TestTimer c'tor的第二行被执行。 – 2012-07-28 11:49:07

+0

我应该怎么做? – Sindico 2012-07-28 12:00:21

+0

@Torsten:我已更新了我的问题,并提供了更多详细信息。我使用Eclipse与gcc – Sindico 2012-07-28 12:44:20

回答

4

您的程序可能有几个问题。从你所显示的,很难说,如果程序在计时器有机会触发之前停止。而且,如果要在换行符后刷新输出,则不会刷新输出,而使用std :: endl。第三,如果你的线程要运行io_service.run()函数,那么线程可能会找到一个空的io队列,run()将立即返回。为了防止这种情况,有一个工作班,这将阻止这一点。这里是我的例子,从你的代码,这可能会按预期工作:

#include <boost/asio.hpp> 
#include <boost/thread.hpp> 
#include <iostream> 

class TestTimer 
{ 
public: 
    TestTimer() 
     : service() 
     , work(service) 
     , thread(boost::bind(&TestTimer::classifierBehavior,this)) 
     , timer(service,boost::posix_time::milliseconds(1000)) 
    { 
     timer.async_wait(boost::bind(&TestTimer::timerBehavior, this)); 
    } 

    ~TestTimer() 
    { 
     thread.join(); 
    } 
private: 
    void classifierBehavior() 
    { 
     service.run(); 
    } 


    void timerBehavior() { 
     std::cout << "timerBehavior" << std::endl; 
     timer.expires_at(timer.expires_at() + boost::posix_time::milliseconds(1000)); 
     timer.async_wait(boost::bind(&TestTimer::timerBehavior,this)); 
    } 

    boost::asio::io_service   service; 
    boost::asio::io_service::work work; 
    boost::thread     thread; 
    boost::asio::deadline_timer  timer; 
}; 

int main() 
{ 
    TestTimer test; 
} 
+0

+1不错的完整答案 – 2012-07-28 16:56:30

相关问题