最近做一个需求,需要程序不停止的情况下,定时刷新配置参数。
先做个timer类:
typedef boost::function0<bool> TaskFunc;
class Timer
{
public:
Timer(boost::asio::io_service& ios);
virtual ~Timer();
void schedule(TaskFunc task, boost::posix_time::ptime trigger_time, boost::posix_time::time_duration duration = boost::posix_time::seconds(0));
void cancel();
private:
void handle_timeout(const boost::system::error_code& ec);
boost::asio::deadline_timer timer_;
boost::posix_time::ptime trigger_time_;
boost::posix_time::time_duration duration_;
TaskFunc task_;
};
typedef boost::shared_ptr<Timer> TimerPtr;
</pre><pre class="cpp" name="code" style="white-space: pre-wrap; word-wrap: break-word; width: 994.640625px; font-size: 14px; line-height: 23.3240013122559px;">
然后最外层,根据刷新时间,<span style="font-family: Arial, Helvetica, sans-serif;">调用dataMgr的readconfig来创建一个独立线程读取配置文件:</span>
:
int refresh_minutes = config.get("refresh_minutes", (int) 60);
Timer timer(io_service);
boost::posix_time::ptime trigger_time(now.date(), boost::posix_time::time_duration(hh, mm, 0));
if (trigger_time < now)
<span style="white-space: pre;"> </span>trigger_time += boost::posix_time::minutes(<span style="font-family: Arial, Helvetica, sans-serif;">refresh_minutes</span>);
timer.schedule(boost::bind(&DataMgr::ReadIpConfig, &DataMgr::instance()), trigger_time, boost::posix_time::minutes(<span style="font-family: Arial, Helvetica, sans-serif;">refresh_minutes</span>));
bool DataMgr::ReadIpConfig()
{
try
{
boost::thread thr(boost::bind(&DataMgr::ReadIpConfigFromXML, this));
}
catch (const char* msg)
{
LOG4CPLUS_WARN(logger, msg);
return false;
}
return true;
}
bool DataMgr::ReadIpConfigFromXML()
{
boost::mutex::scoped_lock lock(loading_, boost::try_to_lock_t());
//read conf
return true;
}