diff --git a/src/fenrirscreenreader/core/processManager.py b/src/fenrirscreenreader/core/processManager.py index 5ec18cdb..d6835397 100644 --- a/src/fenrirscreenreader/core/processManager.py +++ b/src/fenrirscreenreader/core/processManager.py @@ -13,7 +13,19 @@ from fenrirscreenreader.core import debug from fenrirscreenreader.core.eventData import FenrirEventType -# Standalone worker functions for multiprocessing (cannot be instance methods) +# Standalone functions for multiprocessing (cannot be instance methods) +def _heart_beat_timer(running): + """ + Standalone heartbeat timer function for multiprocessing. + Returns current timestamp after a short sleep. + """ + try: + time.sleep(0.5) + except Exception as e: + print(f"ProcessManager _heart_beat_timer: Error during sleep: {e}") + return time.time() + + def _custom_event_worker_process( running, event_queue, function, pargs=None, run_once=False ): @@ -81,7 +93,7 @@ class ProcessManager: self.running = self.env["runtime"]["EventManager"].get_running() self.add_simple_event_thread( FenrirEventType.heart_beat, - self.heart_beat_timer, + _heart_beat_timer, multiprocess=True, ) diff --git a/src/fenrirscreenreader/remoteDriver/tcpDriver.py b/src/fenrirscreenreader/remoteDriver/tcpDriver.py index 149eda17..dd89ce4a 100644 --- a/src/fenrirscreenreader/remoteDriver/tcpDriver.py +++ b/src/fenrirscreenreader/remoteDriver/tcpDriver.py @@ -20,8 +20,10 @@ class driver(remoteDriver): def initialize(self, environment): self.env = environment + # Use threading instead of multiprocessing to avoid pickle issues + # with self.env (which contains unpicklable file handles) self.env["runtime"]["ProcessManager"].add_custom_event_thread( - self.watch_dog, multiprocess=True + self.watch_dog, multiprocess=False ) def watch_dog(self, active, event_queue): diff --git a/src/fenrirscreenreader/remoteDriver/unixDriver.py b/src/fenrirscreenreader/remoteDriver/unixDriver.py index d994ecfa..088c7339 100644 --- a/src/fenrirscreenreader/remoteDriver/unixDriver.py +++ b/src/fenrirscreenreader/remoteDriver/unixDriver.py @@ -20,8 +20,10 @@ class driver(remoteDriver): def initialize(self, environment): self.env = environment + # Use threading instead of multiprocessing to avoid pickle issues + # with self.env (which contains unpicklable file handles) self.env["runtime"]["ProcessManager"].add_custom_event_thread( - self.watch_dog, multiprocess=True + self.watch_dog, multiprocess=False ) def watch_dog(self, active, event_queue): diff --git a/src/fenrirscreenreader/screenDriver/vcsaDriver.py b/src/fenrirscreenreader/screenDriver/vcsaDriver.py index aef34b4e..a71af4a6 100644 --- a/src/fenrirscreenreader/screenDriver/vcsaDriver.py +++ b/src/fenrirscreenreader/screenDriver/vcsaDriver.py @@ -126,8 +126,10 @@ class driver(screenDriver): "default", # fontfamily ] ) # end attribute ) + # Use threading instead of multiprocessing to avoid pickle issues + # with self.env (which contains unpicklable file handles) self.env["runtime"]["ProcessManager"].add_custom_event_thread( - self.update_watchdog, multiprocess=True + self.update_watchdog, multiprocess=False ) def get_curr_screen(self):