fix while stopper
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user