System: Use SetWaitableTimer() for throttling on Windows

This commit is contained in:
Connor McLaughlin 2021-01-14 00:40:25 +10:00
parent 3b433d8d3e
commit d44de3a9dc

View file

@ -1299,7 +1299,31 @@ void Throttle()
else if (sleep_time >= MINIMUM_SLEEP_TIME) else if (sleep_time >= MINIMUM_SLEEP_TIME)
{ {
#ifdef WIN32 #ifdef WIN32
Sleep(static_cast<u32>(sleep_time / 1000000)); static HANDLE throttle_timer;
static bool throttle_timer_created = false;
if (!throttle_timer_created)
{
throttle_timer_created = true;
throttle_timer = CreateWaitableTimer(nullptr, TRUE, nullptr);
if (throttle_timer)
std::atexit([]() { CloseHandle(throttle_timer); });
else
Log_ErrorPrintf("CreateWaitableTimer() failed, falling back to Sleep()");
}
if (throttle_timer)
{
LARGE_INTEGER due_time;
due_time.QuadPart = -static_cast<s64>(static_cast<u64>(sleep_time) / 100u);
if (SetWaitableTimer(throttle_timer, &due_time, 0, nullptr, nullptr, FALSE))
WaitForSingleObject(throttle_timer, INFINITE);
else
Log_ErrorPrintf("SetWaitableTimer() failed: %08X", GetLastError());
}
else
{
Sleep(static_cast<u32>(sleep_time / 1000000));
}
#else #else
const struct timespec ts = {0, static_cast<long>(sleep_time)}; const struct timespec ts = {0, static_cast<long>(sleep_time)};
nanosleep(&ts, nullptr); nanosleep(&ts, nullptr);