asynchron widgets absturzsicher beeinflussen

Fragen zu Tkinter.
Antworten
KlausMerkert
User
Beiträge: 22
Registriert: Freitag 22. Mai 2009, 11:16

Liebe Experten,

wie ich es ausprobiert habe und wie man sich auch denken kann, mag es tkinter nicht, wenn es beliebig unterbrochen wird. Beispielsweise könnte ein Zähler in einem separaten Thread laufen, dessen Inhalt in einem Label angezeigt werden soll. Für solche Zwecke gibt es in Delphi die VCL-Funktion synchronize, der man die auszuführende Funktion übergibt. Meine Vorstellung von synchronize ist es, dass die Ausführung der übergebenen Funktion solange verzögert wird, bis es 'passt'. Es tröstet mich nicht, dass Abstürze selten sind und auf manchen Maschinen noch nicht passiert sind. Meine Frage ist also: Wie bewältigt man das Problem üblicherweise?

Viele Grüße

Klaus Merkert
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Schau hier mal unter Protocols.
MfG
HWK
KlausMerkert
User
Beiträge: 22
Registriert: Freitag 22. Mai 2009, 11:16

zu ICCCM fand ich in wikipedia:
"
Im "UNIX-Haters Handbook" wurde ICCCM folgendermaßen beschrieben: "In summary, ICCCM is a technological disaster: a toxic waste dump of broken protocols, backward compatibility nightmares, complex nonsolutions to obsolete nonproblems, a twisted mass of scabs and scar tissue intended to cover up the moral and intellectual depravity of the industry’s standard naked emperor."
"
Das Handbuch ist von 1993 und 74 Seiten lang. Ist das wirklich die 'übliche Lösung'?

Viele Grüße

K.Merkert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Das UNIX Haters Handbuch hat eher humoristischen Wert und bezieht sich auf die komerziellen Unixes die in den Achtzigern üblich waren (und zu großen Teilen ausgestorben sind, neben AIX dümpelt noch HP/UX rum und Solaris, aber letzteres ist über OpenSolaris auf Frischzellenkur gegangen). Natürlich greift es Probleme auf die damals und teilweise auch heute noch existieren, aber sein Urteil allein darauf zu stützen ist etwas arg kurzsichtig.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Kann mir mal jemand erklären was das Problem im ersten Beitrag mit "protocols" zu tun hat!?

Die übliche Lösung ist eine Queue zur Kommunikation zwischen den beiden Threads die von `Tkinter` aus mit der `after()`-Methode periodisch abgefragt wird.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

BlackJack hat geschrieben:Kann mir mal jemand erklären was das Problem im ersten Beitrag mit "protocols" zu tun hat!?

Die übliche Lösung ist eine Queue zur Kommunikation zwischen den beiden Threads die von `Tkinter` aus mit der `after()`-Methode periodisch abgefragt wird.
Ich habe es so verstanden, dass der OP verhindern wollte, dass Tkinter beliebig beendet wird. Dazu dient protocol('WM_DELETE_WINDOW', ...). In der hiermit installierten Routine könnte der OP dann andere laufende Threads kontrolliert beenden. Dass der OP eine vernünftige Kommunikation zwischen den Threads verwendet, habe ich einfach vorausgesetzt, da es hierzu ja bereits massenhaft Erörterungen im Forum gab.
MfG
HWK
KlausMerkert
User
Beiträge: 22
Registriert: Freitag 22. Mai 2009, 11:16

Hallo HWK,

es scheint tatsächlich ein Missverständniss zu geben. Genau diese 'vernünftige Kommunikation zwischen den Threads' ist das, was ich suche. Selbstverständlich habe ich nach den ' massenhaft Erörterungen im Forum ' gesucht, aber leider nicht gefunden. Ich suche auch gerne selbst, wenn vielleicht jemand einem Anfänger einen Tipp gibt, wie. Mit der 'Suche' war ich jedenfalls nicht erfolgreich. Welche Suchbegiffe wählt man in einem solchen Fall?
Den Tipp mit der Queue habe ich bereits mehrfach gefunden. Das funktioniert doch nur, weil queue threadsicher ist, oder? Ich bin bisher vor dieser Lösung zurückgeschreckt, weil sie im Vergleich zu Delphi aufwändig erscheint. So etwas wie synchronize in Delphi oder asyncExec in Java scheint es in Tkinter nicht zu geben. Ist das so? Ich dachte after_idle könnte das Äquivalent sein. Aber die Experimente scheinen das nicht zu bestätigen.

Viele Grüße

K.Merkert
dahaze
User
Beiträge: 75
Registriert: Freitag 13. März 2009, 10:57
Wohnort: im Schwabenland

Hallo Klaus!

Im Grunde genommen ist ja der gleichzeitige Zugriff auf eine bestimmte Speicherstelle das Problem bei mehreren parallelen Threads. ( Wobei der Mainloop der GUI nichts anderes als ein weiterer Thread ist.)

Um diese Speicherstellen vor gleichzeitigem Zugriff zu schützen kommt man nicht um bestimmte Mechanismen wie z.B. eine Queue oder Semaphoren herum.
Implementiere doch einfach eine Queue für alle GUI Ausgaben deiner Threads wie unter http://effbot.org/zone/tkinter-threads.htm beschrieben und so bist du schonmal in diesem Bereich sicher.

Gruß,
dahaze

PS: allg. gute Doku für Threadprogrammierung: http://heather.cs.ucdavis.edu/~matloff/ ... hreads.pdf
lunar

@KlausMerkert: Tkinter ist ein sehr einfaches und rudimentäres Toolkit und kann sich weder mit der VCL noch mit AWT, Swing oder SWT messen.
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

KlausMerkert hat geschrieben:Welche Suchbegiffe wählt man in einem solchen Fall?
Hallo, Klaus!
Meine Bemerkung war nicht überheblich gemeint. Es beruht ja eher auf einem Missverständnis meinerseits. Such doch einfach mal nach 'tkinter threads'. Da dürftest Du einiges Interessantes finden.
MfG
HWK
KlausMerkert
User
Beiträge: 22
Registriert: Freitag 22. Mai 2009, 11:16

Hallo,

zunächst mal vielen Dank für die Tipps.
Ich entnehme den Beiträgen, dass 'einfachere' Lösungen wie in VCL bzw. SWT in Tkinter wohl nicht existieren. Ich werde mich also insbesondere erst mal mit PyThread.pdf von Matloff und Hsu beschäftigen. Den Link zu effbot.org kenne ich, habe ihn aber noch nicht nachvollzogen. Wenn ich damit durch bin, was leicht mal ein, zwei Wochen dauern kann, melde ich mich wieder.

Allen vielen Dank für die Anregungen!

Viele Grüße

Klaus Merkert
Antworten