diff options
Diffstat (limited to 'gr-uhd/apps/msgq_runner.py')
-rw-r--r-- | gr-uhd/apps/msgq_runner.py | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/gr-uhd/apps/msgq_runner.py b/gr-uhd/apps/msgq_runner.py new file mode 100644 index 0000000000..31bebcf0df --- /dev/null +++ b/gr-uhd/apps/msgq_runner.py @@ -0,0 +1,70 @@ +# +# Copyright 2009 Free Software Foundation, Inc. +# +# This file is part of GNU Radio +# +# SPDX-License-Identifier: GPL-3.0-or-later +# +# + +""" +Convenience class for dequeuing messages from a gr.msg_queue and +invoking a callback. + +Creates a Python thread that does a blocking read on the supplied +gr.msg_queue, then invokes callback each time a msg is received. + +If the msg type is not 0, then it is treated as a signal to exit +its loop. + +If the callback raises an exception, and the runner was created +with 'exit_on_error' equal to True, then the runner will store the +exception and exit its loop, otherwise the exception is ignored. + +To get the exception that the callback raised, if any, call +exit_error() on the object. + +To manually stop the runner, call stop() on the object. + +To determine if the runner has exited, call exited() on the object. +""" + +from gnuradio import gr +import threading + +class msgq_runner(threading.Thread): + + def __init__(self, msgq, callback, exit_on_error=False): + threading.Thread.__init__(self) + + self._msgq = msgq + self._callback = callback + self._exit_on_error = exit_on_error + self._done = False + self._exited = False + self._exit_error = None + self.setDaemon(1) + self.start() + + def run(self): + while not self._done: + msg = self._msgq.delete_head() + if msg.type() != 0: + self.stop() + else: + try: + self._callback(msg) + except Exception as e: + if self._exit_on_error: + self._exit_error = e + self.stop() + self._exited = True + + def stop(self): + self._done = True + + def exited(self): + return self._exited + + def exit_error(self): + return self._exit_error |