Windows 8 (.1) спит на 1 мс больше, чем нужно

Sleep на Windows 8.1 x64 всегда длится на 1 миллисекунду больше, чем нужно. Например Sleep(1) длится примерно 2 миллисекунды, Sleep(2) — 3 и т. Д. timeBeginPeriod установлен на 1. Вкл Windows 7 работает нормально, как и ожидалось (без лишних миллисекунд). Это поведение нормально / можно исправить?

#include <Windows.h>
#include <stdio.h>

#pragma comment(lib, "winmm.lib")

LARGE_INTEGER Frequency;

long long int GetCurrent()
{
LARGE_INTEGER counter;

QueryPerformanceCounter(&counter);

return (1000000 * counter.QuadPart / Frequency.QuadPart);
}

int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
timeBeginPeriod(1);

QueryPerformanceFrequency(&Frequency);

const unsigned int count = 1000;

long long int buffer[count];

long long int lastTime = GetCurrent(), currentTime;

for (unsigned int i = 0; i < count; i++)
{
currentTime = GetCurrent();

buffer[i] = currentTime - lastTime;

lastTime = currentTime;

Sleep(1);
}

timeEndPeriod(1);

FILE *file = fopen("log.txt", "w");

for (unsigned int i = 0; i < count; i++)
fprintf(file, "%ld\n", buffer[i]);

fclose(file);

return EXIT_SUCCESS;
}

4

Решение

NtDelayExecution обходной путь благодаря Mehrdad.

static NTSTATUS (__stdcall *NtDelayExecution)(BOOL Alertable, PLARGE_INTEGER DelayInterval) = (NTSTATUS (__stdcall*)(BOOL, PLARGE_INTEGER)) GetProcAddress(GetModuleHandle(L"ntdll.dll"), "NtDelayExecution");

LARGE_INTEGER delay;

unsigned int milliseconds = 1;

delay.QuadPart = (milliseconds > 1) ? -10000LL * (milliseconds - 1) : -1LL;

NtDelayExecution(false, &delay);
0

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector