有时候我们需要用到定时器这样一个东西,但是我们如果去一个窗口里面 SetTimer,但我们又需要在一个非 UI 类(线程)里要用计时器,那么解耦就没有办法实现了。有没有更好的办法呢?
答案是肯定的,我看可以写一个单件定时器类,用来管理定时控制,并且全局访问。你可能需要的知识有:单件模板类、Boost 等。我们期望的使用方式是:
/**
* \file timer.h
* \author arnozhang
* \date 2012.8.13
* \brief 系统计时器模块.
*/
#ifndef __TIMER_H__
#define __TIMER_H__
namespace Util
{
//
// 计时器回调函数.
//
typedef boost::function<void()> TimerCallback;
typedef boost::function<void()> AsyncCallProc;
/**
* 设置并启动一个计时器.
*
* \param[in] timerID: 计时器 ID.
* \param[in] nElapse: 计时器响应间隔.
* \param[in] timerCbk: 计时器回调.
* \param[in] bLoopTimer: 是否是循环计时器.
*
* \remarks
* 当 bLoopTimer 为 false 时,计时器的回调函数只执行一次.
* 然后该计时器会从计时器管理器中删除.
*/
void SetTimerCallback(
void* timerID,
int nElapse,
TimerCallback timerCbk,
bool bLoopTimer = true
);
/**
* 清除一个计时器.
*
* \param[in] timerID: 清除的计时器的 ID.
*
* \remarks
* 如果计时器管理器中没有这个 ID 对应的计时器,
* 将什么都不做.否则删除计时器.
*/
void KillTimerCallback(void* timerID);
inline void AsyncCall(AsyncCallProc asyncProc)
{
int dummy = 0;
SetTimerCallback(&dummy, 500, asyncProc, false);
}
#define ASYNC_CALL_BIND(class_name, method_name) \
boost::bind(&class_name::method_name, this)
#define TIMER_CALL_BIND(class_name, method_name) \
ASYNC_CALL_BIND(class_name, method_name)
} /*namespace Util ends