tinux Posted July 23, 2012 at 09:25 PM Share Posted July 23, 2012 at 09:25 PM Hallo zusammen, zuerst mal eine kleine Anmerkung, ich habe gerade sowohl mit tinkerforge als auch mit wxpython begonnen, ich bin also kein Experte. Zum Testen von tinkerforge und wxpython habe ich das folgende kleine Python Programm geschrieben: #!/usr/bin/env python import wx HOST = "localhost" PORT = 4223 UID_POTI = "5XA" UID_TEMP = '5QE' UID_HUM = '62G' UID_JOY = '5TN' from tinkerforge.ip_connection import IPConnection from tinkerforge.bricklet_rotary_poti import RotaryPoti from tinkerforge.bricklet_temperature import Temperature from tinkerforge.bricklet_humidity import Humidity from tinkerforge.bricklet_joystick import Joystick class App(wx.App): def OnInit(self): self.frame = myFrame('Tinkerforge Test', (50, 60), (450, 340)) self.frame.Show() self.SetTopWindow(self.frame) return True class myFrame(wx.Frame): def __init__(self, title, pos, size): wx.Frame.__init__(self, None, -1, title, pos, size) panel1 = wx.Panel(self, -1) wx.StaticText(panel1, -1, 'Temp:', pos=(10, 15)) self.posCtrl1 = wx.TextCtrl(panel1, -1, '', pos=(50, 10)) wx.StaticText(panel1, -1, 'Pos:', pos=(10, 55)) self.posCtrl2 = wx.TextCtrl(panel1, -1, '', pos=(50, 50)) wx.StaticText(panel1, -1, 'x, y:', pos=(10, 95)) self.posCtrl3 = wx.TextCtrl(panel1, -1, '', pos=(50, 90)) wx.StaticText(panel1, -1, 'Hum:', pos=(10, 145)) self.posCtrl4 = wx.TextCtrl(panel1, -1, '', pos=(50, 140)) def onMove1(self, temperature): self.posCtrl1.SetValue(str(temperature / 100.)) def onMove2(self, position): self.posCtrl2.SetValue(str(position)) def onMove3(self, positionx, positiony): self.posCtrl3.SetValue('%s, %s' % (str(positionx), str(positiony))) def onMove4(self, humidity): self.posCtrl4.SetValue(str(humidity)) if __name__ == '__main__': ipcon = IPConnection(HOST, PORT) poti = RotaryPoti(UID_POTI) ipcon.add_device(poti) poti.set_position_callback_period(50) temp = Temperature(UID_TEMP) ipcon.add_device(temp) temp.set_temperature_callback_period(50) joy = Joystick(UID_JOY) ipcon.add_device(joy) joy.set_position_callback_period(50) hum = Humidity(UID_HUM) ipcon.add_device(hum) hum.set_humidity_callback_period(50) app = App() temp.register_callback(temp.CALLBACK_TEMPERATURE, app.frame.onMove1) poti.register_callback(poti.CALLBACK_POSITION, app.frame.onMove2) joy.register_callback(joy.CALLBACK_POSITION, app.frame.onMove3) hum.register_callback(hum.CALLBACK_HUMIDITY, app.frame.onMove4) app.MainLoop() ipcon.destroy() Dieses Skript funktioniert anfaenglich, gibt aber nach einigen Sekunden Fehlermeldungen. Es sind aber teilweise verschiedene Fehlermeldungen, die aber alle (noch) nicht zum Absturz des Skripts fuehren. Irgendwann kommt dann aber der Segmentation Fault und das Programm stoppt. Es sind solche Fehlermeldungen (fuer alle 4 BRICKLET.register_callback einzeln): tinux@lx1 ~/work/mypython/demo $ python brick_test_cb_gui.py (python2.7:9289): GLib-GObject-CRITICAL **: g_object_ref: assertion `object->ref_count > 0' failed (python2.7:9289): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed (python2.7:9289): Pango-CRITICAL **: pango_layout_get_iter: assertion `PANGO_IS_LAYOUT (layout)' failed Segmentation fault tinux@lx1 ~/work/mypython/demo $ python brick_test_cb_gui.py (python2.7:9301): GLib-GObject-CRITICAL **: g_object_ref: assertion `object->ref_count > 0' failed (python2.7:9301): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed (python2.7:9301): GLib-GObject-CRITICAL **: g_object_ref: assertion `object->ref_count > 0' failed (python2.7:9301): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed Segmentation fault tinux@lx1 ~/work/mypython/demo $ python brick_test_cb_gui.py Segmentation fault tinux@lx1 ~/work/mypython/demo $ python brick_test_cb_gui.py (python2.7:9321): GLib-GObject-CRITICAL **: g_object_ref: assertion `object->ref_count > 0' failed (python2.7:9321): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed (python2.7:9321): GLib-GObject-CRITICAL **: g_object_ref: assertion `object->ref_count > 0' failed (python2.7:9321): GLib-GObject-CRITICAL **: g_object_unref: assertion `G_IS_OBJECT (object)' failed (python2.7:9321): Pango-CRITICAL **: pango_layout_line_get_extents: assertion `LINE_IS_VALID (line)' failed Segmentation fault tinux@lx1 ~/work/mypython/demo $ Zuerst dachte ich, dass es ein Problem mit meiner Python Installation sei, da bin ich mir aber nicht mehr sicher. Das Skript funktioniert nicht auf * Sabayon Linux 64 bit * Linux Mint Debian Edition 64 bit aber auf * Sabayon Linux 32 bit * Linux Mint Debian Edition PPC 32 bit funktioniert alles tadellos und auch ohne Fehlermeldungen. Kann das Skript evtl mal jemand testen mit 64 bit? Uebrigens tritt das Problem fuer jede einzelne BRICKLET.register_callback auf, nicht nur fuer eine. Waere fuer feedback dankbar. Im Moment vermute ich, dass es ein 64 bit Problem ist. Quote Link to comment Share on other sites More sharing options...
photron Posted July 24, 2012 at 08:03 AM Share Posted July 24, 2012 at 08:03 AM Callbacks werden von einem eigenen Callback Thread der IP Connection ausgeführt. Typischerweise ist es in GUI Frameworks aber so, dass man nur vom Haupt Thread mit dem GUI interagieren darf. Dass heißt du kannst nicht einfach aus Callback heraus mit dem GUI interagieren. Die Probleme die du da siehst kommen daher, dass du es doch tust. Dass es auf 32bit funktioniert halte ich für Zufall. Du musst also etwas zwischen den Callback Thread und dein GUI setzen, dass sich um korrekte Kommunikation zwischen den beiden kümmert. Google fördert für wxWidgets und Python das hier zu tage: http://www.blog.pythonlibrary.org/2010/05/22/wxpython-and-threads/ Dort werden wx.CallAfter und das Publish-Subscribe Pattern verwendet um von einem nicht-GUI Thread mit dem GUI zu kommunizieren. Quote Link to comment Share on other sites More sharing options...
tinux Posted July 27, 2012 at 07:52 AM Author Share Posted July 27, 2012 at 07:52 AM Vielen Dank fuer die Antwort. Der Link scheint sehr hilfreich zu sein. Bisher hatte ich zwar noch nicht die Zeit das zu testen, aber dort werde ich mal beginnen. Sobald es klappt, oder auch wenn nicht, berichte ich wieder 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.