jan Posted July 8, 2012 at 07:08 PM Share Posted July 8, 2012 at 07:08 PM Wie kann ich ein Callback am Programmende oder zwischendurch beenden? Weil, das Programm scheint den Callback noch abarbeiten zu wollen, obwohl das Programm beendet und somit auch (ordnungsgemäß) ipcon.destroy() ausgeführt worden ist. Exception in thread Thread-2: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 551, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 504, in run self.__target(*self.__args, **self.__kwargs) File "/home/jan/python/tinkerforge/ip_connection.py", line 227, in callback_loop device.registered_callbacks[function_id](*self.data_to_return(data[4:], form)) File "test_servo_callback.py", line 27, in cb_reached distanz1=dist1.get_distance() File "/home/jan/python/tinkerforge/ip_connection.py", line 76, in func return f(self, *args, **kwargs) File "/home/jan/python/tinkerforge/bricklet_distance_ir.py", line 70, in get_distance return self.ipcon.send_request(self, DistanceIR.FUNCTION_GET_DISTANCE, (), '', 'H') File "/home/jan/python/tinkerforge/ip_connection.py", line 306, in send_request raise Error(Error.TIMEOUT, msg) Error: -1: Did not receive response for function 1 in time Quote Link to comment Share on other sites More sharing options...
photron Posted July 9, 2012 at 11:01 AM Share Posted July 9, 2012 at 11:01 AM Du hast da eine Race Condition entdeckt. Ich denke es passiert da folgendes: Du rufst destroy() auf, der Socket wird geschlossen und der Receive Thread wird beendet. Der Callback Thread läuft aber noch weil noch was in der Callback Queue ist. Daher führt er den Callback noch aus. Im Callback rufst du get_distance() auf. Das bekommt einen Timeout weil der Receive Thread nicht mehr läuft und keine Antwort mehr ankommt. Damit das richtig funktioniert muss in destroy() zuerst den Callback Thread beenden werden und erst wenn der keine Callbacks mehr bearbeitet, dann erst kann der Receive Thread beendet. Ich hab das in der angehängten ip_connection.py so abgeändert, damit sollte das Problem nicht mehr auftreten. Kannst du das testen?ip_connection.py Quote Link to comment Share on other sites More sharing options...
AuronX Posted July 9, 2012 at 11:52 AM Share Posted July 9, 2012 at 11:52 AM Ist das ein Unterschied zu den C#-Bindings oder habe ich das falsch im Kopf? Ich würde denken in den C#-Bindings geht der Callback-Thread sofort fort, kann mich aber auch täuschen. Quote Link to comment Share on other sites More sharing options...
jan Posted July 9, 2012 at 12:26 PM Author Share Posted July 9, 2012 at 12:26 PM Werd ich am Wochenende testen. Danke. Quote Link to comment Share on other sites More sharing options...
photron Posted July 13, 2012 at 04:25 PM Share Posted July 13, 2012 at 04:25 PM Ich habe jetzt in den aktuellen Version aller Bindings sichergestellt, dass der Callback Thread beendet ist bevor der Receive Thread beendet wird. Damit kann das beschriebene Problem nicht mehr auftreten. Quote Link to comment Share on other sites More sharing options...
jan Posted July 13, 2012 at 06:16 PM Author Share Posted July 13, 2012 at 06:16 PM Danke, das ist super. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.