唤醒boost :: sleep timer并在C ++中将其重置为0

时间:2011-09-07 08:09:15

标签: c++ multithreading boost sleep

我每10秒左右需要一次心跳信号。为了实现这一点,我使用以下构造函数生成了一个类:

HeartBeat::HeartBeat (int Seconds, MessageQueue * MsgQueue)
{
TimerSeconds = Seconds;
    pQueue = MsgQueue;
    isRunning = true;
    assert(!m_pHBThread);
    m_pHBThread = shared_ptr<thread>(new thread(boost::bind(&HeartBeat::TimerStart,this)));
}

在新线程中调用以下方法:

void HeartBeat::TimerStart ()
{
while (1)
{
    cout << "heartbeat..." << endl;
    boost::this_thread::sleep(boost::posix_time::seconds (TimerSeconds));
    addHeartBeat();
}
}

这会产生任何问题的心跳。但是我希望能够将睡眠定时器重置为零。有没有一种简单的方法,或者我应该使用

以外的东西
 boost::this_thread::sleep

为了我的睡眠?


操作系统:Redhat

IDE:Eclipse

代码语言:C ++


编辑:

我看过使用

m_pHBThread->interrupt();

这似乎就是我所追求的,所以谢谢你!

3 个答案:

答案 0 :(得分:5)

这听起来就像异步计时器那样。既然你已经使用了boost,那么从长远来看使用boost自己的异步定时器是否有意义?

#include <iostream>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
#include <boost/asio.hpp>
boost::posix_time::ptime now()
{
        return boost::posix_time::microsec_clock::local_time();
}
class HeartBeat {
    boost::asio::io_service ios;
    boost::asio::deadline_timer timer;
    boost::posix_time::time_duration TimerSeconds;
    boost::thread thread;
 public:
    HeartBeat(int Seconds) : ios(), timer(ios),
        TimerSeconds(boost::posix_time::seconds(Seconds))
    {
        reset(); // has to start timer before starting the thread
        thread = boost::thread(boost::bind(&boost::asio::io_service::run,
                                           &ios));
    }
    ~HeartBeat() {
        ios.stop();
        thread.join();
    }
    void reset()
    {
        timer.expires_from_now(TimerSeconds);
        timer.async_wait(boost::bind(&HeartBeat::TimerExpired,
                        this, boost::asio::placeholders::error));
    }
    void TimerExpired(const boost::system::error_code& ec)
    {
        if (ec == boost::asio::error::operation_aborted) {
           std::cout << "[" << now() << "] timer was reset" << std::endl;
        } else {
           std::cout << "[" << now() << "] heartbeat..." << std::endl;
           reset();
        }
    }
};
int main()
{
    std::cout << "["  << now() << "] starting up.\n";
    HeartBeat hb(10);
    sleep(15);
    std::cout << "["  << now() << "] Resetting the timer\n";
    hb.reset();
    sleep(15);
}

试运行:

~ $ ./test
[2011-Sep-07 12:08:17.348625] starting up.
[2011-Sep-07 12:08:27.348944] heartbeat...
[2011-Sep-07 12:08:32.349002] Resetting the timer
[2011-Sep-07 12:08:32.349108] timer was reset
[2011-Sep-07 12:08:42.349160] heartbeat...

答案 1 :(得分:1)

也许您可以使用interrupt()来执行此操作。

答案 2 :(得分:0)

嗯,每次心跳都会发起一个新线程效率不高...... 我会用一个线程和一个睡眠来做它。 如果您需要更改心跳频率,则可以终止当前线程并使用新的睡眠时间启动新线程。你可以使用boost :: thread和中断信号。

编辑:在这里查看有关提升线程的信息:boost thread management

如果你想把时间重置为零并立即执行你的代码,那么在catch :: bolt_interrupted ...中捕获它...

EDIT2:我没有正确看待代码,我认为每次心脏跳动都会发生新线程的常见错误...抱歉,我的错误...我想我不喜欢事实上,线程的名称是:TimerStart()
无论如何,我认为如果你需要立即执行心跳,使用interrupt()并捕捉它应该有效。