我需要弄清楚如果我的应用程序正在运行,如何在特定时间调用函数。
它可能会在一个while循环并检查时间,但我不希望它每分钟检查一次,但我不希望它错过确切的时间,比如18:00。
有没有办法做到这一点?
答案 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信息:当您的应用启动时,请检查所需事件的剩余时间,并在适当的时间开始Timer Queue Timer弹出。定时器将在初始间隔后弹出,然后在定期间隔后重复出现。
CreateTimerQueueTimer功能
创建一个计时器队列计时器。这个 计时器在指定的到期时到期 时间,然后经过每一次指定 期。当计时器到期时, 调用回调函数。
使这个事件驱动比定期检查时钟更有效率。
答案 2 :(得分:1)
最好的方法是使用提供此功能的操作系统工具,您只需担心编写功能。但如果那不是一个选项,你需要像你说的那样定期检查时钟。
答案 3 :(得分:0)
您可以在系统中安装将通知您的应用程序的计划任务。 如果你的系统是Linux,你可以使用cron。