借助 Windows 下的多媒体定时器来实现延时,精度测试起来还可以
定时器默认是异步的,需要用到回调函数
这里使用条件变量达到阻塞调用的结果,也不会占用 CPU 资源
#include <memory>
#include <mutex>
#include <condition_variable>
#include <windows.h>
struct TimerContext {
bool timerIsUp;
std::mutex timerMutex;
std::condition_variable timerCv;
};
static void callback(UINT, UINT, DWORD_PTR dwUser, DWORD_PTR, DWORD_PTR) {
TimerContext *pCtx = (TimerContext *)dwUser;
std::unique_lock<std::mutex> lk(pCtx->timerMutex);
pCtx->timerIsUp = true;
pCtx->timerCv.notify_all();
}
void msleep(int ms) {
timeBeginPeriod(1);
TimerContext ctx;
ctx.timerIsUp = false;
UINT timerId = timeSetEvent(ms, 1, callback, (DWORD_PTR)&ctx, TIME_ONESHOT);
std::unique_lock<std::mutex> lk(ctx.timerMutex);
ctx.timerCv.wait(lk, [&ctx]() {
return ctx.timerIsUp;
});
timeKillEvent(timerId);
timeEndPeriod(1);
}
测试:
#include <chrono>
int main() {
while (1) {
auto t1 = std::chrono::steady_clock::now();
msleep(10);
auto t2 = std::chrono::steady_clock::now();
std::cout << "delay " << std::chrono::duration<double, std::milli>(t2 - t1).count() << "ms" << std::endl;
}
return 0;
}
测试结果: