我的C ++程序有一个主循环,一直运行直到程序说完了。在主循环中,我希望能够在某些时间间隔内发生某些事情。像这样:
int main()
{
while(true)
{
if(ThirtySecondsHasPassed())
{
doThis();
}
doEverythingElse();
}
return 0;
}
在这种情况下,我希望每隔30秒调用doThis(),如果不需要调用,则允许主循环继续并处理其他所有内容。
我该怎么做?另请注意,此计划旨在持续运行数天,数周甚至数月。
答案 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的最后一个参数,这样只要计时器滴答它就会调用你自己的函数。