System: Use SetWaitableTimer() for throttling on Windows
This commit is contained in:
parent
3b433d8d3e
commit
d44de3a9dc
|
@ -1299,7 +1299,31 @@ void Throttle()
|
|||
else if (sleep_time >= MINIMUM_SLEEP_TIME)
|
||||
{
|
||||
#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
|
||||
const struct timespec ts = {0, static_cast<long>(sleep_time)};
|
||||
nanosleep(&ts, nullptr);
|
||||
|
|
Loading…
Reference in New Issue