Events gehen verloren während Cairo Draw

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
metanurb
User
Beiträge: 1
Registriert: Freitag 3. Dezember 2010, 08:51

Ahoi zusammen,

folgendes Problem treibt mich in den Wahnsinn:


Ich lese per gobject.io_add_watch('/dev/input/js0', gobject.IO_IN, self.read_handler) Event Daten von einem Joystick, und emitte ein Signal welches ich dann mit einer Methode in einer Gtk App connecte. (object.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_INT, gobject.TYPE_INT, gobject.TYPE_FLOAT)

Diese wiederum enthält ein selbstgeschriebenes Widget welches die Joystickposition per Cairo zeichnet wenn Daten gemeldet werden.

In dem Widget wird dann z.B. eine Methode set_x(self, x_value) aufgerufen welches das Objektattribut x_value setzt und dann ein self.queue_draw() aufruft.

In der Methode welche auf den expose_event reagiert, wird dann die DrawingArea des Widgets gezeichnet (ein Kreis wird in einem anderen Kreis als Positionsanzeige für den Joystick gesetzt).

Das alles funktioniert auch alles super wenn das Widget eine Grösse von ca 150x150px hat. CPU Last ist dann auch nur ca. 2 Prozent über Normal.
Nur wenn das Widget mal Vollbild-Grösse hat dann scheinen expose_events verloren zu gehen.

Man merkt das daran, dass wenn man die Axen des Joysticks schnell bewegt und dann los lässt, die Anzeige des Widgets nicht in die Mittelposition zurückkehrt.

Ich habe mir daraufhin die Koordinaten vor Aufruf der set_x/y Methoden auf die Console ausgeben lassen und da fehlen die Positionen auch, was wohl heisst, dass der io_add_watch Event gar nicht erst gefeuert wird wenn gerade viel gezeichnet werden muss.

Wenn man die eigentlichen Zeichenbefehle auskommentiert und die Daten nur auf der Console ausgibt passiert das nie.. da tauchen immer alle Positionen auf.

http://www.python-forum.de/pastebin.php?mode=view&s=94

Was übersehe ich hier?! HALP!


Korrektur: die Zeile 123 war nur ein Fehler und ist in der aktuellen Version gar nicht mehr drinnen.. hat aber auch nix genützt.
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

Hallo,

wie sieht denn deine io_add_watch() Routine aus / wie der Callback? Ich kann es momentan leider nicht testen, aber vielleicht wäre ein Queue oder ähnliches hier hilfreich? Damit könntest du die Daten von io_add_watch() schnell wegschaufeln und später dann zeichnen.
Vielleicht musst du die Daten auch "intelligent" wegschmeißen: Es bringt ja vermutlich nichts, eine Koordinate zu zeichnen, wenn der Joystick sich mittlerweile schon ganz woanders befindet.

Ist gerade schwer zu beurteilen, ich habe nur den Eindruck, dass das Problem darin besteht, dass man den io_add_watch()-Callback nicht zu lange blockieren darf.

Schöne Grüße,

brb
Antworten