Problem mit Thread

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
jawosis
User
Beiträge: 2
Registriert: Donnerstag 13. August 2009, 14:10

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!
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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 ;)
jawosis
User
Beiträge: 2
Registriert: Donnerstag 13. August 2009, 14:10

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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Antworten