Sorry if this is a duplicate/newbie question (didn't find anything searching).  
When going thru the python examples.  I came across a race condition where the 
thread would start to run prior to object's constructor completing.  The fix is 
to manually move the code generated for starting the probe thread to the very 
end of the constructor.


If this "bug" is open already thanks for your time, if not here are some more 
details:


Tutorial 3, section 3.1.5, you're asked to modify the probe thread to reference 
members of the class to set_ampl and set_freq, those functions in-turn access 
members of the object, which may not have been initialized yet because the 
thread runs while the constructor is still running.

https://wiki.gnuradio.org/index.php/Guided_Tutorial_GNU_Radio_in_Python

The symptom:

Exception in thread Thread-1:

Traceback (most recent call last):

  File 
"/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py",
 line 801, in __bootstrap_inner

    self.run()

  File 
"/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py",
 line 754, in run

    self.__target(*self.__args, **self.__kwargs)

  File "power.py", line 95, in _variable_function_probe_0_probe

    self.set_ampl(0.3)

  File "power.py", line 174, in set_ampl

    self.analog_sig_source_x_0.set_amplitude(self.ampl)

  File 
"/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/gnuradio/gr/hier_block2.py",
 line 92, in __getattr__

    return getattr(self._impl, name)

AttributeError: 'top_block_sptr' object has no attribute 'analog_sig_source_x_0'

The resolution:

diff -rupN if_else.py if_else2.py

--- if_else.py 2017-03-29 13:20:32.000000000 -0400

+++ if_else2.py 2017-03-29 13:19:37.000000000 -0400

@@ -101,7 +101,6 @@ class if_else(gr.top_block, Qt.QWidget):

                 time.sleep(1.0 / (10))

         _variable_function_probe_0_thread = 
threading.Thread(target=_variable_function_probe_0_probe)

         _variable_function_probe_0_thread.daemon = True

-        _variable_function_probe_0_thread.start()



         self.qtgui_time_sink_x_0 = qtgui.time_sink_f(

         1024, #size

@@ -160,6 +159,7 @@ class if_else(gr.top_block, Qt.QWidget):

         self.connect((self.analog_sig_source_x_0, 0), (self.blocks_throttle_0, 
0))

         self.connect((self.analog_sig_source_x_1, 0), 
(self.qtgui_time_sink_x_0, 0))

         self.connect((self.blocks_throttle_0, 0), (self.probe, 0))

+        _variable_function_probe_0_thread.start()



     def closeEvent(self, event):

         self.settings = Qt.QSettings("GNU Radio", "if_else")


Thanks
_______________________________________________
Discuss-gnuradio mailing list
Discuss-gnuradio@gnu.org
https://lists.gnu.org/mailman/listinfo/discuss-gnuradio

Reply via email to