как правильно сделать задержку в 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 шт):

Автор решения: Harry

Думаю, что ответ кроется в том, что сказано в описании к таймеру:

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 миллисекунд о какой-то точности говорить не приходится...

По крайней мере на моей машине и операционке :)

→ Ссылка