summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastian Bloessl <mail@bastibl.net>2019-06-18 09:26:46 +0200
committerMartin Braun <martin.braun@ettus.com>2019-06-19 13:00:00 -0700
commit0cc238fbb298c3acaed8f3c048d7a51bfa876fd1 (patch)
tree46872fa93c682a9b3457ab4a5324a8feec0d0c1c
parent746a82d41f72b7aa51900de3545bc9322b79ae35 (diff)
grc: better qt flowgraph shutdown
-rw-r--r--grc/blocks/options.block.yml2
-rw-r--r--grc/core/generator/flow_graph.py.mako31
-rw-r--r--grc/gui/Application.py2
3 files changed, 32 insertions, 3 deletions
diff --git a/grc/blocks/options.block.yml b/grc/blocks/options.block.yml
index 89dc25a786..6d1d2d2002 100644
--- a/grc/blocks/options.block.yml
+++ b/grc/blocks/options.block.yml
@@ -134,13 +134,13 @@ templates:
imports: |-
from gnuradio import gr
from gnuradio.filter import firdes
+ import signal
% if generate_options == 'qt_gui':
from PyQt5 import Qt
import sys
% endif
% if generate_options == 'bokeh_gui':
import time
- import signal
import functools
from bokeh.client import push_session
from bokeh.plotting import curdoc
diff --git a/grc/core/generator/flow_graph.py.mako b/grc/core/generator/flow_graph.py.mako
index 291b89f0a6..9b2e8478c0 100644
--- a/grc/core/generator/flow_graph.py.mako
+++ b/grc/core/generator/flow_graph.py.mako
@@ -352,6 +352,16 @@ def main(top_block_cls=${class_name}, options=None):
% endif
tb.show()
+ def sig_handler(sig=None, frame=None):
+ Qt.QApplication.quit()
+
+ signal.signal(signal.SIGINT, sig_handler)
+ signal.signal(signal.SIGTERM, sig_handler)
+
+ timer = Qt.QTimer()
+ timer.start(500)
+ timer.timeout.connect(lambda: None)
+
def quitting():
tb.stop()
tb.wait()
@@ -395,6 +405,20 @@ def main(top_block_cls=${class_name}, options=None):
serverProc.kill()
% elif generate_options == 'no_gui':
tb = top_block_cls(${ ', '.join(params_eq_list) })
+
+ def sig_handler(sig=None, frame=None):
+ % for m in monitors:
+ % if m.params['en'].get_value() == 'True':
+ tb.${m.name}.stop()
+ % endif
+ % endfor
+ tb.stop()
+ tb.wait()
+ sys.exit(0)
+
+ signal.signal(signal.SIGINT, sig_handler)
+ signal.signal(signal.SIGTERM, sig_handler)
+
% if flow_graph.get_option('run_options') == 'prompt':
tb.start(${ flow_graph.get_option('max_nouts') or '' })
% for m in monitors:
@@ -409,13 +433,18 @@ def main(top_block_cls=${class_name}, options=None):
tb.stop()
% elif flow_graph.get_option('run_options') == 'run':
tb.start(${flow_graph.get_option('max_nouts') or ''})
- % endif
% for m in monitors:
% if m.params['en'].get_value() == 'True':
tb.${m.name}.start()
% endif
% endfor
+ % endif
tb.wait()
+ % for m in monitors:
+ % if m.params['en'].get_value() == 'True':
+ tb.${m.name}.stop()
+ % endif
+ % endfor
% endif
diff --git a/grc/gui/Application.py b/grc/gui/Application.py
index f2b4dd40a5..8feaca3de8 100644
--- a/grc/gui/Application.py
+++ b/grc/gui/Application.py
@@ -719,7 +719,7 @@ class Application(Gtk.Application):
elif action == Actions.FLOW_GRAPH_KILL:
if page.process:
try:
- page.process.kill()
+ page.process.terminate()
except OSError:
print("could not terminate process: %d" % page.process.pid)