Seite 1 von 1

Problem mit Thread

Verfasst: Donnerstag 13. August 2009, 14:25
von jawosis
Hallo,

ich habe hier ein Code Schnipsel, welches offensichtlich nicht so funkioniert wie es sollte.

Code: Alles auswählen

class ScanDialog(gtk.Dialog):
  def __init__(self, parent, device):
    self.dev = device
    gtk.Dialog.__init__(self, "Scan finger", parent,
      gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, None)
    self.set_has_separator(False)
    self.text_label = gtk.Label("Scan your finger now")
    self.vbox.pack_start(self.text_label)
    self.vbox.show_all()

  def enroll(self):
    thread.start_new_thread(self.enroll_runner, (None,))
    gtk.Dialog.run(self)
    return (self.fp, self.fp_img)

  def enroll_runner(self, void_arg):
    (self.fp, self.fp_img) = self.dev.enroll_finger()
    self.response(1)
Ich habe nur Grundwissen in Python (ich programmiere sonst in ruby), aber ich glaube das hier folgendes Problem besteht:
Die Funktion "enroll()" startet einen Thread in dem die Funktion "enroll_runner()" aufgerufen wird, welche wiederum die Attribute "ip" und "ip_img" der Klasse "ScanDialog" setzt. Bevor aber die Attribute gesetzt werden können läuft der Code in der "enroll()" Funktion weiter und wenn die entsprechenden Attribute an die aufrufende Funktion zurückgegeben werden sollen gibt es folgende Fehlermeldung.

Code: Alles auswählen

Traceback (most recent call last):
  File "pyfprint_demo.py", line 219, in enroll
    (fp,img) = dlg.enroll()
  File "pyfprint_demo.py", line 66, in enroll
    return (self.fp, self.fp_img)
AttributeError: 'ScanDialog' object has no attribute 'fp'
Kann mir jemand helfen diesen Code Schnipsel zum Laufen zu bringen?
Und was macht eigentlich dieses "self.response(1)" am Ende der "enroll_runner()" Funktion (kann dazu keine Dokumentation finden)?

Vielen Dank!

Verfasst: Donnerstag 13. August 2009, 14:51
von cofi
GUI und Threads vertragen sich nicht.
Aber dein Problem duerfte sein, dass nicht garantiert ist, dass der Thread sofort, bzw vor dem Beenden der Funktion ausgefuehrt wird und deshalb kein ``self.fp`` existiert.

Wenn dein ``dev`` mit der GUI arbeitet duerfte das auch Problem sein.

Uebriges: Willkommen im Forum!
Und die Klammern beim Packen und Entpacken von Tuples sind ueberfluessig ;)

Verfasst: Donnerstag 13. August 2009, 15:08
von jawosis
Hallo Cofi,

danke für die schnelle Antwort - das Forum scheint also gut zu sein :D
Aber dein Problem duerfte sein, dass nicht garantiert ist, dass der Thread sofort, bzw vor dem Beenden der Funktion ausgefuehrt wird und deshalb kein ``self.fp`` existiert.
Genau das habe ich vermutet, aber die Frage ist wie ich das entsprechend "reparieren" kann. Geht das nur ohne Threads - du meinst ja GUI und Threads vertragen sich nicht?

Das "dev" in dem code ist übrigens ein Fingerprintreader und der arbeitet nicht mit der GUI, sondern mi C Code.

Verfasst: Donnerstag 13. August 2009, 15:46
von cofi
Die meisten GUIs sind nicht Thread-safe, d.h. nur der Mainthread darf malen, sonst passieren boese Dinge (TM).

Du hast 2 Moeglichkeiten, entweder du initialisierst ``self.fp`` mit einem bekannten Wert (z.B. ``None``) und testest bei der Verwendung.

Oder du verzichtest auf den Thread und fuehrst die Funktion direkt aus.