如何在c ++中的某个时间每天调用一次函数?

时间:2010-12-14 18:13:27

标签: c++ timer

我需要弄清楚如果我的应用程序正在运行,如何在特定时间调用函数。

它可能会在一个while循环并检查时间,但我不希望它每分钟检查一次,但我不希望它错过确切的时间,比如18:00。

有没有办法做到这一点?

4 个答案:

答案 0 :(得分:8)

如果您想在已经投放的程序中调用特定功能,请使用Boost的Date Time库和Asio

#include <boost/date_time/gregorian/gregorian_types.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <boost/asio.hpp>

namespace gregorian = boost::gregorian;
namespace posix_time = boost::posix_time;
namespace asio = boost::asio;

asio::io_service io_service_;
asio::deadline_timer timer_ (io_service_);

然后设定时间。这是使用所需时间的字符串的示例,例如“18:00:00”。 (请注意,Boost默认为UTC时间戳!)

gregorian::date today = gregorian::day_clock::local_day();
posix_time::time_duration usertime = posix_time::duration_from_string(time)
posix_time::ptime expirationtime (today, usertime);

现在将计时器设置为调用foo()

timer_.expires_at (expirationtime);
timer_.async_wait (foo);    // use Boost::bind() if you want a member function

您可以使用上述两个代码段添加任意数量的timer_计时器。当一切准备就绪时:

io_service_.run ();

请注意,这将接管当前线程。因此,如果您希望程序的其余部分继续运行,则必须从其他线程调用run()。 (显然,使用Boost的Thread库。)

答案 1 :(得分:5)

编辑:我不知道为什么我认为这是Windows。我没有看到它说的任何地方。以下API信息仅适用于Windows,但原理相同。 Boost.Asio有便携式异步计时器,如果不是Windows。

Windows信息:当您的应用启动时,请检查所需事件的剩余时间,并在适当的时间开始Timer Queue Timer弹出。定时器将在初始间隔后弹出,然后在定期间隔后重复出现。

  

CreateTimerQueueTimer功能

     

创建一个计时器队列计时器。这个   计时器在指定的到期时到期   时间,然后经过每一次指定   期。当计时器到期时,   调用回调函数。

使这个事件驱动比定期检查时钟更有效率。

答案 2 :(得分:1)

最好的方法是使用提供此功能的操作系统工具,您只需担心编写功能。但如果那不是一个选项,你需要像你说的那样定期检查时钟。

答案 3 :(得分:0)

您可以在系统中安装将通知您的应用程序的计划任务。 如果你的系统是Linux,你可以使用cron。