как правильно сделать задержку в WaitableTimer?
Есть класс:
class WaitableTimer
{
public:
WaitableTimer()
{
m_timer = ::CreateWaitableTimer(NULL, FALSE, NULL);
if (!m_timer)
throw std::runtime_error("Failed to create waitable time (CreateWaitableTimer), error:" + std::to_string(::GetLastError()));
}
~WaitableTimer()
{
::CloseHandle(m_timer);
m_timer = NULL;
}
void SetAndWait(unsigned relativeTime100Ns)
{
LARGE_INTEGER dueTime = { 0 };
dueTime.QuadPart = static_cast<LONGLONG>(relativeTime100Ns) * -1;
BOOL res = ::SetWaitableTimer(m_timer, &dueTime, 0, NULL, NULL, FALSE);
if (!res)
throw std::runtime_error("SetAndWait: failed set waitable time (SetWaitableTimer), error:" + std::to_string(::GetLastError()));
DWORD waitRes = ::WaitForSingleObject(m_timer, INFINITE);
if (waitRes == WAIT_FAILED)
throw std::runtime_error("SetAndWait: failed wait for waitable time (WaitForSingleObject)" + std::to_string(::GetLastError()));
}
private:
HANDLE m_timer;
};
Чтобы получить 1мс задержку мне надо передать SetAndWait 5000.Я не понимаю что это за значение это же не микросекунды и не наносекунды.(Я на самом деле не до конца понимаю как это все работает). Но чтобы получить задержку,например в 11мс я соответственно умножаю 5000*11 но получаю задержку 6мс. В чем может быть дело,и как правильно использовать это?И какие недостатки у этого класса?Всегда ли и на любых компьютерах будет ли одинаковое значение?Объясните,пожалуйста в кратце как работает WaitableTimer а то в msdn сложно перевести на русский и понять
Ответы (1 шт):
Думаю, что ответ кроется в том, что сказано в описании к таймеру:
The actual timer accuracy depends on the capability of your hardware.
Я вызываю ваш таймер с параметром от 10 до 10000000 (по 20 раз с каждым для оценки погрешности), и считаю среднюю задержку в микросекундах. Получаю
t = 10 964 +- 196
t = 100 1001 +- 45
t = 1000 1008 +- 17
t = 10000 1542 +- 476
t = 100000 10250 +- 397
t = 1000000 100402 +- 412
t = 10000000 1000476 +- 375
Т.е., похоже, для интервалов менее чем 10 миллисекунд о какой-то точности говорить не приходится...
По крайней мере на моей машине и операционке :)