Jump to content

[Python] callback beenden


jan

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...