这里设计了一个异步定时器,在windows下定时器通常是基于消息队列实现的,也是同步的。c++11提供了一系列方便我写一个跨平台定时器的标准函数和类。以下是一个简单的但是完备的定时器的实现。
#pragma once
#include <limits>
#include <condition_variable> // std::condition_variable
#include <chrono>
#include <thread>
#include <mutex>
#include <memory>
#include <functional>
#include <atomic>
#include "min_max_heap.hpp"//仿照消息队列queue,添加了几个函数,他是最小堆。代码就不上传了
#if defined(_WIN32)
#define TRACE(...) _CrtDbgReport( _CRT_WARN, __FILE__, __LINE__, "min_max_heap",__VA_ARGS__ );
#else
#define TRACE(...) printf(__VA_ARGS__);
#endif
namespace prudens
{
uint64_t now()
{
return duration_cast<milliseconds>(
system_clock::now() - time_point<system_clock>() ).count();
}
typedef std::function<void( uint32_t, void* ) > timer_callback;
struct timer_msg
{
#define MAX_MACRO_COMPILE_SUPPORT
uint32_t timer_id;
uint32_t elapsed;
uint64_t expired;
bool repeat;
void* userdata;
timer_callback action;
timer_msg() :timer_id( 0 ),
elapsed( 0 ),
expired( std::numeric_limits<uint64_t>::max MAX_MACRO_COMPILE_SUPPORT() ),
repeat( false ),
userdata(