Sehr komplizierte ProgressBar

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.
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Das ist kein GTK+-Problem, das gilt für alle GUI-Toolkits. Wie sollen auch zwei Threads gleichzeitig zeichnen? Und natürlich kann man auch mit PyGTK Threads verwenden. Man darf aber entweder nur auf mit einem Thread, nämlich dem Thread, in dem die GTK-Hauptschleife ausgeführt wird, zugreifen, was mit `gobject.idle_add()` recht gut geht (was in Tkinter das `after()` wäre) oder man muss mit Locks arbeiten (`gtk.gdk.threads_enter()` und `gtk.gdk.threads_leave()`). Auf jeden Fall muss beim Initialisieren `gobject.threads_init()` aufgerufen werden, greift man mit mehr als einem Thread auf die GUI zu noch `gtk.gdk.threads_init()`.

Aber die Forensuche müsste dazu eigentlich etwas finden.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

helduel hat geschrieben:time.sleep(x) gibt anderen Threads wieder etwas Luft zum atmen. Allerdings meine ich gelesen zu haben, dass Threads mit GTK so einige Haken haben soll.
Das ist mit jedem Toolkit so. Tkinter und wxPython sowie PyQt sind nicht besser und die Pseudo-Timer die GTK-bietet wenn man nicht über Threads gehen will können oft ausreichend sein um sich die komplette Thread-Lösung zu sparen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Uff, das kling ja schon wirklich ziemlich kompliziert Trundle, ich werde mir da denke ich mal einiges was du geschrieben hast durchlesen, hoffe mal ich bekomme es hin, wenn jemandem sowieso langweilig ist, wäre ich echt Dankbar, wenn mir bei den Themen:

gobject.idle_add()
gtk.gdk.threads_enter()
gtk.gdk.threads_leave()
gobject.threads_init()
gtk.gdk.threads_init()

jemand ein bisschen helfen könnte, beziehungsweise ein paar "qualitativ gute" Tutorials oder How to's geben könnte. Kenne mich in dem Thema nämlich noch nicht so wirklich gut aus :roll:

Aber schon mal vielen Dank
Dieser Beitrag hat mir nun etwas mehr geholfen :wink:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich persönlich würde ja einfach den Prozess mit ``subprocess.Popen`` starten und einen ``gobject.timeout_add`` machen, das ich an eine Prozedur binde, die die Ausgaben des Subprocesses aus der Pipe liest und die Progressbar aktualisiert. Das ist doch nicht so schwer.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Wie lese ich mit subprocess aus der Pipe?
Hab leider momentan nur so die Grundlagen von Python und GTK. Wenn du gerade Zeit hast, wäre es echt super, wenn du mal ein Beispiel mit dem Ping google machen könntest.
Aber schon mal Danke für den Tipp

Oder vllt ein kurtzes "Statement" zu gobject.timeout_add^^
Ich finde nämlich auch in google nicht sooo brauchbare Ergebnisse, die mir erklären könnten, wie ich gobject.timeout_add am besten bei mir verwende
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Man könnte natürlich auch `gobject.io_add_watch()` benutzen, Beispiel hier. Aber das wird höchstwahrscheinlich nicht unter Windows funktionieren, weil da `select()` nur mit Sockets und nicht mit Pipes funktioniert und ich mal stark davon ausgehe, dass da `select()` benutzt wird. Außerdem könnte das Programm natürlich hängen, wenn der gestartete Prozess mal weniger als eine Zeile ausgibt.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

gugugs hat geschrieben:Wie lese ich mit subprocess aus der Pipe?
Hab leider momentan nur so die Grundlagen von Python und GTK. Wenn du gerade Zeit hast, wäre es echt super, wenn du mal ein Beispiel mit dem Ping google machen könntest.
Aber schon mal Danke für den Tipp
Lies doch einfach die Dokumentation zu Subprocess, ich werde sie dir wohl kaum vorlesen müssen, oder? Sowohl die Original-Doku hat ein Beispiel, als auch das Wiki und im Forum bist du nicht der erste der Subprocess nutzt.
gugugs hat geschrieben:Oder vllt ein kurtzes "Statement" zu gobject.timeout_add^^
Ich finde nämlich auch in google nicht sooo brauchbare Ergebnisse, die mir erklären könnten, wie ich gobject.timeout_add am besten bei mir verwende
Dazu gibt es im PyGTK-Forum massig Beispiele und ehrlich, das ist so simpel, darauf kommt man eigentlich auch selbst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Leonidas hat geschrieben:
gugugs hat geschrieben:Wie lese ich mit subprocess aus der Pipe?
Hab leider momentan nur so die Grundlagen von Python und GTK. Wenn du gerade Zeit hast, wäre es echt super, wenn du mal ein Beispiel mit dem Ping google machen könntest.
Aber schon mal Danke für den Tipp
Lies doch einfach die Dokumentation zu Subprocess, ich werde sie dir wohl kaum vorlesen müssen, oder? Sowohl die Original-Doku hat ein Beispiel, als auch das Wiki und im Forum bist du nicht der erste der Subprocess nutzt.
Das Beispiel hatte ich im anderen Thread auch schon gebracht ;-) Er hat das also schon ...

Und ich hatte ihm auch schon Beispiele zu Threads rausgesucht ... ok, wenn es eine andere, einfachere Möglichkeit gibt, würde ich mir die natürlich auch zuerst angucken!
gugugs
User
Beiträge: 113
Registriert: Dienstag 30. Dezember 2008, 12:38

Juhuu, habe nun mein Programm so hinbekommen wie ich es wollte, vielen Dank für die Geduld und die Tipps :)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Wie wäre es, wenn Du einfach mal hier postest. Somit könnten später andere User mit ähnlichem Problem Deine Lösung nachvollziehen :-)

http://paste.pocoo.org/
Antworten