ich habe folgendes Problem. Ich habe eine Klasse zum zählen von Sekunden. Dabei ist in der run() jeweils eine Sekunde Pause dann wird ein counter erhöht und das ganze mittels gtk.gdk.threads_enter() und gtk.gdk.thread_leave() auf einer GUI aktualisiert.
Desweiteren habe ich einen button, der, je nach bedarf einmal start oder pause anzeigt. Wenn der zähler zählt zeigt der Button Pause an, wenn der Zähler nicht zählt zeigt er Start an.
Klappt alles eigentlich super, wenn jetzt aber öfters auf den start/pause button drücke verzögert sich der timer. Er bleibt quasi stehen, der button ist mit farbe unterlegt, also noch gedrückt und umso länger das programm läuft desto größer wird die verzögerung. Nicht so toll, wenn man will das der Zähler jetzt weiterzählt aber erst 20 sekunden brauch um überhaupt wieder anzulaufen.
Ich schreibe das ganze für Maemo auf einem Nokia N810 sollte aber keinen unterschied machen. gtk.gdk.threads_init() wurde auch vor gtk.main aufgerufen.
anbei ein paar Code schnipsel
Code: Alles auswählen
...
# Der Start/Pause Button
self.buttonTimeStart = gtk.Button("Start")
self.buttonTimeStart.connect("clicked", self.startTimer, None)
...
# Die Methoden dazu
def startTimer(self, widget, event, *args):
self.buttonTimeStart.connect("clicked", self.pauseTimer, None)
self.buttonTimeStart.set_label("Pause")
self.clockThread.go()
def pauseTimer(self, widget, event, *args):
self.buttonTimeStart.connect("clicked", self.startTimer, None)
self.buttonTimeStart.set_label("Start")
self.clockThread.pause()
...
# Und die Klasse für den Thread
class timeThread(threading.Thread):
def __init__(self, timeLabel, window):
threading.Thread.__init__(self)
self.clock = 0;
self.timeLabel = timeLabel
self.window = window
self.oldState = 0
self.state = 0 # 0 = Pause, 1 = Running, 2 = Reset
def setState(self, state) :
self.state = state
def repaintLabel(self):
minInt = self.clock / 60
if minInt < 10 :
minStr = "0" + str(minInt)
else :
minStr = str(minInt)
sekInt = self.clock - (60 * minInt)
if sekInt < 10 :
sekStr = "0" + str(sekInt)
else :
sekStr = str(sekInt)
self.timeLabel.set_markup("<span size=\"xx-large\" weight=\"bold\">"+minStr+":"+sekStr+"</span>")
def step(self, value):
if (self.clock+value < 0) :
self.clock = 0
else :
if (self.clock+value >= (60*60)) :
self.clock = 60*60
else:
self.clock = self.clock + value
self.state = 0
def run(self):
while 1:
if self.state == 1 :
sleep(1)
self.clock = self.clock + 1
gtk.gdk.threads_enter()
self.repaintLabel()
gtk.gdk.threads_leave()
else:
sleep(1)
gtk.gdk.threads_enter()
self.repaintLabel()
gtk.gdk.threads_leave()
def pause(self):
self.state = 0
def reset(self):
self.state = 2
self.clock = 0
self.timeLabel.set_markup("<span size=\"xx-large\" weight=\"bold\">00:00</span>")
self.state = 0
def go(self):
self.state = 1
pö