diff --git a/examples/example3/ChildProcessControl3.py b/examples/example3/ChildProcessControl3.py index 5e61cc90d748ceae0aa65736fff11da0feb61da2..a158a4e087f242989b40477acdf3b7796bce7a1d 100644 --- a/examples/example3/ChildProcessControl3.py +++ b/examples/example3/ChildProcessControl3.py @@ -1,3 +1,5 @@ +import logging + from PySide6.QtCore import Signal import cmp diff --git a/examples/example3/example3.py b/examples/example3/example3.py index 8e1b454c3a64fb78e9e0c515e53b21b685a7cb14..a5836ea5f2d0ba9087545af6b032241a3ad20983 100644 --- a/examples/example3/example3.py +++ b/examples/example3/example3.py @@ -24,8 +24,8 @@ class Form(QDialog): def __init__(self, parent=None): super().__init__(parent) - child_con = ChildProcessControl3(self, internal_log=False, internal_log_level=logging.DEBUG) - + child_con = ChildProcessControl3(self, internal_log=False, internal_log_level=logging.INFO) + child_con.set_internal_log_level(logging.CRITICAL) child_con.mp_finished.connect(self.updateUI) diff --git a/src/cmp/CBase.py b/src/cmp/CBase.py index 53e400f4418d863be3839ba5478192a4e5a3dfd2..f0e96700fe557945c9808c6855d4462a06b571ce 100644 --- a/src/cmp/CBase.py +++ b/src/cmp/CBase.py @@ -49,12 +49,14 @@ class CBase: """ if self._internal_logger is not None: if enable: + self._internal_logger.disabled = False self._internal_logger.info(f"Internal logger of {self.__class__.__name__} has been enabled.") + else: self._internal_logger.warning(f"Internal logger of {self.__class__.__name__} has been disabled.") - self._internal_logger.level = logging.ERROR + self._internal_logger.disabled = True else: - raise Exception("Can't enable internal logger. Internal logger not initialized") + raise Exception("Can't enable internal logger. Internal logger not initialized")# @property def internal_log_level(self): @@ -80,8 +82,6 @@ class CBase: self._internal_logger.info(f"Internal log level of {self.__class__.__name__} has been set to CRITICAL.") else: self._internal_logger.info(f"Internal log level of {self.__class__.__name__} has been set to {level}.") - - self._internal_logger.setLevel(level) else: raise Exception("Can't set internal log level. Internal logger not initialized") diff --git a/src/cmp/CProcess.py b/src/cmp/CProcess.py index 87cf6ec074ff4aec45f32b59446f3af547677d27..4024440fb69703c0d511ffff2661ed0c6c826895 100644 --- a/src/cmp/CProcess.py +++ b/src/cmp/CProcess.py @@ -15,18 +15,16 @@ from cmp.CBase import CBase class CProcess(CBase, Process): - # override the print function + def __init__(self, state_queue: Queue, cmd_queue: Queue, kill_flag, - internal_log: bool = False, - internal_log_level=logging.DEBUG, + internal_log, internal_log_level, *args, **kwargs): Process.__init__(self) self._internal_log_enabled_ = internal_log self._internal_log_level_ = internal_log_level - self.logger = None self.logger_handler = None @@ -59,13 +57,15 @@ class CProcess(CBase, Process): self._internal_logger, self._internal_log_handler = self.create_new_logger( f"(cmp) {self.name}", logger_handler=logging.handlers.QueueHandler(self.state_queue)) + self.internal_log_enabled = self._internal_log_enabled_ + self.internal_log_level = self._internal_log_level_ + self.logger, self.logger_handler = self.create_new_logger(f"{os.getpid()}({self.__class__.__name__})", logger_handler=logging.handlers.QueueHandler( self.state_queue)) - self.internal_log_enabled = self._internal_log_enabled_ - self.internal_log_level = self._internal_log_level_ + self._internal_logger.debug(f"Child process {self.__class__.__name__} started.") @@ -106,7 +106,7 @@ class CProcess(CBase, Process): self._internal_logger.debug(f"Child process monitor {self.__class__.__name__} ended.") def __del__(self): - print(f"Child process {self.name} deleted.") + #self.logger.warning(f"Child process {self.name} deleted.") self.cmd_queue.close() self.state_queue.close() @@ -127,6 +127,8 @@ class CProcess(CBase, Process): self.state_queue.put(result) + + @staticmethod def register_signal(postfix=None, signal_name: str = None): _postfix = postfix.strip() if postfix is not None else None @@ -161,6 +163,14 @@ class CProcess(CBase, Process): return register + @register_signal() + def set_internal_log_level(self, level): + self.internal_log_level = level + + @register_signal() + def set_internal_log_enabled(self, enabled): + self.internal_log_enabled = enabled + @staticmethod def setter(signal_same: str = None): def register(func): diff --git a/src/cmp/CProcessControl.py b/src/cmp/CProcessControl.py index b2da7c231fe9ec7a2527e4ac9cbc034de27cb48c..1733ebc0215291d556bb7e9dc5115def10e637fe 100644 --- a/src/cmp/CProcessControl.py +++ b/src/cmp/CProcessControl.py @@ -20,8 +20,8 @@ from cmp.CBase import CBase class CProcessControl(CBase, QObject): - on_exception_raised = Signal(object, name='on_exception_raised') + def __init__(self, parent: QObject = None, signal_class: QObject = None, internal_log: bool = False, @@ -46,7 +46,6 @@ class CProcessControl(CBase, QObject): self.cmd_queue = Queue() self.state_queue = Queue() - # Thread manager for monitoring the state queue self.thread_manager = QThreadPool() @@ -61,11 +60,11 @@ class CProcessControl(CBase, QObject): self._internal_logger, self._internal_log_handler = self.create_new_logger(f"(cmp) {self.name}") self.internal_log_enabled = internal_log self.internal_log_level = internal_log_level - self.logger, self.logger_handler = self.create_new_logger(f"{self.__class__.__name__}({os.getpid()})") self.on_exception_raised.connect(self.display_exception) self.msg_box = QMessageBox() + # ================================================================================================================== # # ================================================================================================================== @@ -90,6 +89,8 @@ class CProcessControl(CBase, QObject): self._internal_logger.debug(f"Child process {self._child.name} created.") self.thread_manager.start(self._monitor_result_state) + + @property def child(self): return self._child @@ -141,12 +142,11 @@ class CProcessControl(CBase, QObject): self.msg_box.setDetailedText(e.traceback_short()) self.msg_box.setStandardButtons(QMessageBox.Ok) self.msg_box.show() - self._internal_logger.error(f"Error executing {e.function_name} in {e.parent_name}: {e.exception}\n" - f"{e.traceback()}") + self.logger.error(f"Error executing {e.function_name} in {e.parent_name}: {e.exception}\n" + f"{e.traceback()}") except Exception as e: self._internal_logger.error(f"Error while displaying exception: {e}") - def execute_function(self, func: callable, signal: Signal = None): self.register_function(signal)(func)(self) @@ -168,7 +168,7 @@ class CProcessControl(CBase, QObject): args = match.group(2).split(',') return name, args - def get_signature(self: CProcessControl, *args, **kwargs): + def get_signature(self, *args, **kwargs): arguments = locals().copy() arguments.pop("func") @@ -205,6 +205,14 @@ class CProcessControl(CBase, QObject): return register + @register_function() + def set_internal_log_level(self, level): + self.internal_log_level = level + + @register_function() + def set_internal_log_enabled(self, enabled): + self.internal_log_enabled = enabled + def safe_exit(self, reason: str = ""): self._internal_logger.warning(f"Shutting down ProcessControl {os.getpid()}. Reason: {reason}") self._child_kill_flag.value = 0