jan Geschrieben July 8, 2012 at 19:08 Geschrieben July 8, 2012 at 19:08 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 Zitieren
photron Geschrieben July 9, 2012 at 11:01 Geschrieben July 9, 2012 at 11:01 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 Zitieren
AuronX Geschrieben July 9, 2012 at 11:52 Geschrieben July 9, 2012 at 11:52 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. Zitieren
jan Geschrieben July 9, 2012 at 12:26 Autor Geschrieben July 9, 2012 at 12:26 Werd ich am Wochenende testen. Danke. Zitieren
photron Geschrieben July 13, 2012 at 16:25 Geschrieben July 13, 2012 at 16:25 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. Zitieren
jan Geschrieben July 13, 2012 at 18:16 Autor Geschrieben July 13, 2012 at 18:16 Danke, das ist super. Zitieren
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.