Hi Eskil, QT has its own threading library that you'll need to use to spawn a new thread to do the blocking calls in: http://pyqt.sourceforge.net/Docs/PyQt4/qthread.html (sadly, that page is still C++ centric)
PyQT4 usually comes with a set of nice examples, which have been useful for me over the last days; for me, those installed to /usr/share/doc/PyQt4-devel-4.10.1/examples and for your threading intents, you might want to look at /usr/share/doc/PyQt4-devel-4.10.1/examples/network/threadedfortuneserver.py Greetings, and happy hacking, Marcus On 02.07.2014 20:27, Eskil Varenius wrote: > Dear friends of GNU Radio, > I have a question about blocking, threads and GUI. Thing is, I am writing > an GUI application (in PyQT4) where the user can start a GNU Radio > flowgraph by a button. The flowgraph records data from an USRP and some > additional blocks. Now, I want only a finite amount of data so I have added > a "head" block to my flowgraph. The obvious way to run this is as the > following pseudo code program: > # Define flowgraph > class USRP(gr.top_block) > ...connect USRP -> head_block_> file_sink > # Define GUI > GUI__init__() > gui.button.clicked.connect(startUSRP) ... > # Define action to be taken when button clicked, i.e. start flowgraph > startUSRP() > tb=USRP() > tb.start() > tb.wait() # Will block everything until finished > # define and run GUI > main() > app = QtGui.QApplication(sys.argv) > window = main_window() > window.show() > sys.exit(app.exec_()) > if __name__ == '__main__': > main() > > My code runs as expected, in the sense data is produced, but tb.wait is a > blocking call. This means that my GUI will freeze until the flowgraph has > ended. The GUI must not be blocked during flowgraph execution. Also, I > would like to track the progress of the flowgraph (the number of elements > processed / total elements requested). I tried to search online, and there > is some related information, but unfortunately I have not managed to > understand how to put the pieces together yet. I imagine something like > using QTimer to periodically check the status of the flowgraph, by asking > the flowgraph in some way. > This flowgraph ends with writing to a file, after the head_block. Hence, I > suspect that just checking the head_block might not give me all data? > Either I need to add a small extra delay to make sure the file sink gets > all data, or check the number of items passed to the file sink itself? So I > guess the short question is: > How to periodically check if a started flowgraph has finished, without > using a blocking call such as tb.wait? > > I would be very grateful for any hints. I don't know much about C++ and > threading, which makes finding clues from the C++ API more difficult. > However, I am eager to learn if anyone would enlighten me on this. > > Best regards, > Eskil > > > > _______________________________________________ > Discuss-gnuradio mailing list > [email protected] > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
_______________________________________________ Discuss-gnuradio mailing list [email protected] https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
