C ++主循环计时器

时间:2011-05-07 19:32:41

标签: c++ loops time

我的C ++程序有一个主循环,一直运行直到程序说完了。在主循环中,我希望能够在某些时间间隔内发生某些事情。像这样:

int main()
{
    while(true)
    {
        if(ThirtySecondsHasPassed())
        {
            doThis();
        }
        doEverythingElse();
    }
    return 0;
}

在这种情况下,我希望每隔30秒调用doThis(),如果不需要调用,则允许主循环继续并处理其他所有内容。

我该怎么做?另请注意,此计划旨在持续运行数天,数周甚至数月。

3 个答案:

答案 0 :(得分:5)

这是一个更通用的课程,你可以在那里有单独的计时器。

class Timer{
public:
    Timer(time_type interval) : interval(interval) {
        reset();
    }

    bool timedOut(){
        if(get_current_time() >= deadline){
            reset();
            return true;
        }
        else return false;
    }

    void reset(){
        deadline = get_current_time() + interval;
    }

private:
    time_type deadline;
    const time_type interval;
}

答案 1 :(得分:1)

可能是最大的矫枉过正,但是Boost.Asio呢?

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

void doThisProxy(const boost::system::error_code& /*e*/,
    boost::asio::deadline_timer* t)
{
  doThis();
  t->expires_at(t->expires_at() + boost::posix_time::seconds(30));
  t->async_wait(boost::bind(doThisProxy, boost::asio::placeholders::error, t));
}

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

  boost::asio::deadline_timer t(io, boost::posix_time::seconds(30));
  t.async_wait(boost::bind(doThisProxy, boost::asio::placeholders::error, &t));

  io.run();
}

答案 2 :(得分:0)

如果您的程序将在Windows系统中编译和运行,您也可以使用这样的一些Windows处理程序:

SetTimer(hwnd,             // handle to main window 
IDT_TIMER1,            // timer identifier 
30000,                 // 10-second interval 
(TIMERPROC) NULL);     // no timer callback 

while (1)
{
    if (! PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
    {
        doeverythingelse();                   
    }

    if (WM_QUIT == msg.message)
    {
        break;
    }
    if(WM_TIMER == msg.message)
    {
         if(IDT_TIMER1 == msg.wParam)
              do30secInterval();
    }               
}

你也可以传递一些函数作为SetTimer的最后一个参数,这样只要计时器滴答它就会调用你自己的函数。