mirror of
https://github.com/RetroDECK/Duckstation.git
synced 2024-11-27 08:05:41 +00:00
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)
|
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);
|
||||||
|
|
Loading…
Reference in a new issue