mirror of
https://github.com/Textualize/textual.git
synced 2025-10-17 02:38:12 +03:00
win sleep refinements
This commit is contained in:
@@ -2,8 +2,7 @@ import platform
|
||||
import sys
|
||||
|
||||
from asyncio import sleep as asyncio_sleep, get_running_loop
|
||||
from time import monotonic, perf_counter, sleep as time_sleep
|
||||
|
||||
from time import monotonic, perf_counter
|
||||
|
||||
PLATFORM = platform.system()
|
||||
WINDOWS = PLATFORM == "Windows"
|
||||
@@ -17,23 +16,10 @@ else:
|
||||
|
||||
if WINDOWS:
|
||||
|
||||
if sys.version_info >= (3, 11, 0):
|
||||
from ._win_sleep import sleep as win_sleep
|
||||
|
||||
async def sleep(sleep_for: float) -> None:
|
||||
"""An asyncio sleep.
|
||||
|
||||
On Windows this achieves a better granularity that asyncio.sleep
|
||||
|
||||
Args:
|
||||
sleep_for (float): Seconds to sleep for.
|
||||
"""
|
||||
await get_running_loop().run_in_executor(None, time_sleep, sleep_for)
|
||||
|
||||
else:
|
||||
from ._win_sleep import sleep as win_sleep
|
||||
|
||||
async def sleep(sleep_for: float) -> None:
|
||||
await get_running_loop().run_in_executor(None, win_sleep, sleep_for)
|
||||
async def sleep(sleep_for: float) -> None:
|
||||
await get_running_loop().run_in_executor(None, win_sleep, sleep_for)
|
||||
|
||||
else:
|
||||
sleep = asyncio_sleep
|
||||
|
||||
@@ -2,6 +2,7 @@ import ctypes
|
||||
from ctypes.wintypes import LARGE_INTEGER
|
||||
from time import sleep as time_sleep
|
||||
|
||||
|
||||
__all__ = ["sleep"]
|
||||
|
||||
kernel32 = ctypes.windll.kernel32
|
||||
@@ -11,6 +12,7 @@ WAIT_FAILED = 0xFFFFFFFF
|
||||
CREATE_WAITABLE_TIMER_HIGH_RESOLUTION = 0x00000002
|
||||
|
||||
|
||||
|
||||
def sleep(sleep_for: float) -> None:
|
||||
"""A replacement sleep for Windows.
|
||||
|
||||
@@ -19,6 +21,13 @@ def sleep(sleep_for: float) -> None:
|
||||
Args:
|
||||
sleep_for (float): Seconds to sleep for.
|
||||
"""
|
||||
|
||||
# Subtract a millisecond to account for overhead
|
||||
sleep_for = max(0, sleep_for - 0.001)
|
||||
if sleep_for < 0.0005:
|
||||
# Less than 0.5ms and its not worth doing the sleep
|
||||
return
|
||||
|
||||
handle = kernel32.CreateWaitableTimerExW(
|
||||
None,
|
||||
None,
|
||||
@@ -29,7 +38,6 @@ def sleep(sleep_for: float) -> None:
|
||||
time_sleep(sleep_for)
|
||||
return
|
||||
|
||||
sleep_for -= 1 / 1000
|
||||
if not kernel32.SetWaitableTimer(
|
||||
handle,
|
||||
ctypes.byref(LARGE_INTEGER(int(sleep_for * -10_000_000))),
|
||||
@@ -39,7 +47,6 @@ def sleep(sleep_for: float) -> None:
|
||||
0,
|
||||
):
|
||||
kernel32.CloseHandle(handle)
|
||||
print("error")
|
||||
time_sleep(sleep_for)
|
||||
return
|
||||
|
||||
|
||||
Reference in New Issue
Block a user