我有一个Visual 2008 C++03项目,需要一个计时器。我有一个运行良好的实现,但我希望社区就如何改进它提出任何一般性建议。(更通用、创建计时器的成本较低等)
class Timer
{
public:
typedef boost::function< void( ) > OnTimer;
Timer( const OnTimer& f, DWORD timeout )
: cancel_event_( ::CreateEvent( NULL, FALSE, FALSE, NULL ), ::CloseHandle ),
timer_thread_( boost::bind( &Timer::TimerThread, cancel_event_.get(), f, timeout ) ),
timeout_( timeout )
{
};
~Timer() { ::SetEvent( cancel_event_.get() ); };
DWORD Timeout() const { return timeout_; };
private:
static void TimerThread( HANDLE cancel_event, const OnTimer& f, DWORD timeout )
{
if( WAIT_OBJECT_0 != ::WaitForSingleObject( cancel_event, timeout ) )
f();
};
/// time to wait for the timer to fire
UINT timeout_;
/// event signaled when the timer should be canceled
boost::shared_ptr< void > cancel_event_;
/// thread that runs the timer (similar to boost::thread, but doesn't require `localtime`, `gmtime`, or `abort`)
util::CThread timer_thread_;
}; // class Timer先发制人:
SetTimer是不合适的。boost::timer是不合适的。发布于 2012-05-15 23:42:57
我认为您可以创建一个线程来处理所有定时器。创建新计时器时,应将其添加到"timers to触发器“的(同步)队列中。后台线程必须等待最近的计时器被触发。此外,每次修改定时器队列并重新计算“哪个是现在最接近的定时器?”时,您都应该唤醒它。
当队列为空时,后台线程可以被销毁(连接),也可以等待“退出”事件(或创建另一个计时器)。这些只是细节。后台线程可以由第一个定时器创建,并在最后一个定时器被销毁时加入,或者只存在于整个程序执行过程中。
另外,要提高可移植性,可以使用boost::线程库和boost的条件变量,而不是原始Windows事件。
https://codereview.stackexchange.com/questions/11777
复制相似问题