Windows下的简易时间堆轮询
#include "wintimer.h"
#include <queue>
#include <vector>
#include <Windows.h>
#include <stdint.h>
typedef void (*wintimer_cb)(void* arg);
void set_timeout(uint32_t timeout, wintimer_cb _timer_cb, void* usrdata);
void timer_loop_once();
using namespace std;
struct usertimer {
wintimer_cb usrcb;
void* usrdata;
uint64_t timeout;
bool operator > (const usertimer& other) const
{
return timeout > other.timeout;
}
};
priority_queue<usertimer, vector<usertimer>, greater<usertimer> > timer_heap;
void set_timeout(uint32_t timeout, wintimer_cb _timer_cb, void* usrdata)
{
usertimer ut;
ut.usrcb = _timer_cb;
ut.usrdata = usrdata;
ut.timeout = GetTickCount64() + timeout;
timer_heap.push(ut);
}
void timer_loop_once()
{
uint64_t now = GetTickCount64();
while (1) {
if (timer_heap.empty())
return;
const usertimer& ut = timer_heap.top();
if (ut.timeout > now)
break;
ut.usrcb(ut.usrdata);
timer_heap.pop();
}
}