Seite 2 von 2

Verfasst: Montag 1. Dezember 2008, 09:38
von wuf
Hallo Forumfreunde

Das Problem verhält sich bei mir absolut unberechenbar. Einmal scheint es auf dem Performance-Monitor als wäre das Problem nicht vorhanden ca. 10 Min stabil. Ein anderes mal verhält es sich wie ein JoJo. Der Speicherverbrauch steigt langsam an ca. 500kB springt da schnell wieder zurück. Sieht fast so aus als ob hier der Python Garbage-Collector zyklisch ein Säuberung vornimmt. Im Extremfall kommt es sogar zu einer Exception.
Das ganze könnte man als 'Russisches Roulette' bezeichnen. :D

Übrigens die Version von 'yipyip' arbeite auch bei mir stabil.

Gruss wuf :wink:

Verfasst: Montag 1. Dezember 2008, 12:47
von lunar
DasIch hat geschrieben:
BlackJack hat geschrieben:@DasIch: Da finde ich meinen Beitrag jetzt aber unangebracht auf Tkinter verkürzt.
Vielleicht ist er unangebracht verkürzt, kein vielleicht sondern Tatsache ist dass die Qt Variante bei mir dass Verhalten nicht aufweist.
Qt4 verwaltet den Speicher nicht über den Python-GC, sondern über einen eigenen, deterministischen Objektbaum, der Objekte basierend auf Vater-Kind-Verhältnissen zwischen Objekten verwaltet und bereinigt. Das Verhalten von Qt4 in dieser Situation sagt gar nichts über das Verhalten von Tkinter aus.

Im Übrigen ist dein Beispiel ebenso schlecht wie das gepostete Tkinter-Beispiel. Auch in Qt4 sind GUI-Zugriffe aus anderen Threads nicht gut, der kanonische Weg zum Multithreading ist die Nutzung von QtCore.QThread, der ein eigenes Signal auslöst, welches dann mit einem Slot eines Widgets verbunden werden kann. Im Gegensatz zu einfachen Methodenaufrufen sind Signale nämlich threadsicher.

Verfasst: Dienstag 2. Dezember 2008, 15:47
von Robin
Anscheinend lag es an der THREAD-Lösung, weshalb der Speicher beständig anstieg.
Mit dieser Lösungsvariante bleibt mein Speicher stabil.

Code: Alles auswählen

import Tkinter as tk
from itertools import count


def start_counter(label,label1,label2):
     counter = count(1)
     def update_func():
         label.config(text=str(counter.next()))
         label1.config(text=str(counter.next()+20))
         label2.config(text=str(counter.next()+40))
         label2.after(10, update_func)
     update_func()


def main():
     root = tk.Tk()
     label = tk.Label(root)
     label.pack()
     label1 = tk.Label(root)
     label1.pack()
     label2 = tk.Label(root)
     label2.pack()

     start_counter(label,label1,label2)
     button = tk.Button(root, text='Beenden', command=root.quit)
     button.pack()
     #label.after(1000,main())
     root.mainloop()


if __name__ == '__main__':
    main()