1
0

fix while stopper

This commit is contained in:
2026-01-08 20:04:24 +08:00
parent bfaee2028e
commit 886e0caab2
6 changed files with 65 additions and 66 deletions

View File

@@ -9,44 +9,49 @@ else:
class WhileStopper:
is_registered: bool
stop_requested: bool
_is_registered: bool
_stop_requested: bool
def __init__(self) -> None:
self.is_registered = False
self.stop_requested = False
self._is_registered = False
self._stop_requested = False
def is_stop_requested(self) -> bool:
if not self.is_registered:
raise RuntimeError('unexpected stopper status')
if not self._is_registered:
raise RuntimeError("unexpected stopper status")
return self.stop_requested
return self._stop_requested
def register(self):
if self.is_registered:
raise RuntimeError('unexpected stopper status')
if self._is_registered:
raise RuntimeError("unexpected stopper status")
self.stop_requested = False
self._stop_requested = False
if IS_WINDOWS:
win32api.SetConsoleCtrlHandler(self.__win_handler, True)
win32api.SetConsoleCtrlHandler(_win_handler, True)
else:
signal.signal(signal.SIGINT, self.__posix_handler)
self.is_registered = True
signal.signal(signal.SIGINT, _posix_handler)
self._is_registered = True
def unregister(self):
if not self.is_registered:
raise RuntimeError('unexpected stopper status')
if not self._is_registered:
raise RuntimeError("unexpected stopper status")
if IS_WINDOWS:
win32api.SetConsoleCtrlHandler(None, False)
win32api.SetConsoleCtrlHandler(_win_handler, False)
else:
signal.signal(signal.SIGINT, signal.SIG_DFL)
self.is_registered = False
self._is_registered = False
def __win_handler(self, ctrl_type: int) -> bool:
self.stop_requested = True
return True
def __posix_handler(self, signal, frame) -> None:
self.stop_requested = True
INSTANCE: WhileStopper = WhileStopper()
"""The singleton of WhileStopper"""
def _win_handler(ctrl_type: int) -> bool:
INSTANCE._stop_requested = True
return True
def _posix_handler(signal, frame) -> None:
INSTANCE._stop_requested = True