Seite 1 von 1
Funktion alle 5min wiederholen stürzt ab...
Verfasst: Dienstag 18. November 2008, 01:42
von Crady
Hallo, zuammen!
Wieder mal muss ich mich mit einem Problem melden:
Ich habe mein Programm nun fertig un möche die Hauptfunktion alle 5 Minuten wieder ausführen lassen.
Dies habe ich so gemacht:
Code: Alles auswählen
import threading
def StartTimer():
"""Starts the timer."""
timer = threading.Timer(10, main)
timer.start()
...
def main()
...
StartTimer()
Unter Eclipse oder Commandline funktioniert alles perfekt. Doch IDLE friert bei dem Code ein und nach der Umwandlung - sowohl mit pyinstaller 1.3 also auch mit py2exe stürzt das Programm mit der Meldung:
Code: Alles auswählen
C:\Demo>demo1
Exception in thread Thread-1 (most likely raised during interpreter shutdown):
Traceback (most recent call last):
File "C:\Python25\buildDemo\out1.pyz/threading", line 486, in __bootstrap_inne
r
File "C:\Python25\buildDemo\out1.pyz/threading", line 663, in run
File "<string>", line 204, in main
<type 'exceptions.TypeError'>: 'NoneType' object is not callable
Unhandled exception in thread started by
Error in sys.excepthook:
Original exception was:
C:\Demo>Demo1.exe
Unhandled exception in thread started by
Error in sys.excepthook:
Original exception was:
C:\Demo>
ab... Ich habe gelesen, dass dies wohl eine art Bug von Python ist (habe 2.5.2)...
Gibt es eine andere Möglichkeit, die main Funktion alle 5 Minuten auszuführen?
Verfasst: Dienstag 18. November 2008, 02:14
von Crady
Ich habe es jetzt so geregelt:
Code: Alles auswählen
def Timer(ti):
gap = datetime.timedelta(minutes = 2)
while datetime.datetime.today() < ti+gap:
pass
main()
...
def main():
...
ti = datetime.datetime.today()
Timer(ti)
Es wird bestimmt auch anders gehen, aber der Threading Timer soll eh extem ungenau gehen...
Verfasst: Dienstag 18. November 2008, 07:35
von str1442
Du weißt, das deine while Schleife 100% Rechenkraft des Rechners erfordern wird? Du weißt, das es das "time" Modul und eine "sleep" Methode gibt? Du weißt, das Threading mit deinem Problem gar nichts zu tun hat?
Verfasst: Dienstag 18. November 2008, 10:02
von Leonidas
Außerdem ist der Code unbrauchbar, da der Fehler in Zeile 204 auftritt, die du hier nicht gepostet hast. Es ist immer sinnvoller den Code so zu posten wie er ist (bzw. ein Minimalbeispiel das das Problem aufweist), statt da einfach mit ``...`` Sachen wegzulassen - erwartest du dass wir raten was da steht?!
Verfasst: Dienstag 18. November 2008, 11:03
von __marcus__
Was macht denn diese Funktion, die alle 5 Minuten laufen soll bzw. das ganze Skript?
Verfasst: Dienstag 18. November 2008, 11:56
von Mad-Marty
Ich würde auf einen klaren fall von "die main beendet sich bevor die Timer gelaufen sind" tippen.
pthreads werden bei jedem mir bekannten system gekillt wenn der mainthread fertig ist.
Mal abgesehen davon das der schnipsel totaler unsinn ist so wie er da steht.
Verfasst: Dienstag 18. November 2008, 16:31
von jonas
hi.
Was spricht denn nun gegen das oben von str1442 erwähnte time.sleep()
außer ein bisschen Ungenauigkeit.
Code: Alles auswählen
import time
## irgendwelcher code...
def schlafen (seconds):
time.sleep(seconds)
## mach was...
EDIT : Name der Funktion von "timer" zu "schlafen" geändert.
MfG Jonas
Verfasst: Dienstag 18. November 2008, 17:33
von DasIch
jonas hat geschrieben:Was spricht denn nun gegen das oben von str1442 erwähnte time.sleep()
Prinzipiell gar nichts, sowie es aber in deinem Beispiel gezeigt ist einiges. Ich würde nie von einer Funktion "timer" erwarten, dass sie time.sleep verwendet es sei den es handelt sich um eine loop Funktion wie bei einer GUI. Allerdings wäre dann der Name sowieso total unangebracht.
Verfasst: Dienstag 18. November 2008, 18:29
von jonas
Hi.
DasIch hat geschrieben:
Ich würde nie von einer Funktion "timer" erwarten, dass sie time.sleep verwendet es sei den es handelt sich um eine loop Funktion wie bei einer GUI. Allerdings wäre dann der Name sowieso total unangebracht.
Crady hat geschrieben:Ich habe mein Programm nun fertig un möche die Hauptfunktion alle 5 Minuten wieder ausführen lassen.
@ DasIch:
Für mich hörte sich das so an als ob Crady time.sleep() wenn überhaupt öfter aufrufen wollte? Loop? Was meinst du mit `von "timer" erwarten`, soll ich einen passenderen Namen wählen oder was, z.B. schlafen ?
EDIT: Habe den Namen der Funktion in meinem letzten Beitrag geändert.
MfG Jonas

Verfasst: Dienstag 18. November 2008, 18:35
von DasIch
Kommt darauf an was timer wirklicht macht. Sollte er wie im zweiten Code Schnippsel scheinbar den gesamten Programmablauf bestimmen ist der Name wohl eher unangebracht. Soll er einfach nur die Zeit nehmen dann sollte er wirklich nicht mehr tun als die Zeit nehmen.
Verfasst: Dienstag 18. November 2008, 19:48
von lunar
jonas hat geschrieben:Was spricht denn nun gegen das oben von str1442 erwähnte time.sleep() außer ein bisschen Ungenauigkeit.
Die Ungenauigkeit besteht bei jeder Art des Wartens, da Zeitspannen im Userspace normalerweise keine harten Anforderungen erfüllen.
Verfasst: Dienstag 18. November 2008, 20:01
von jonas
hi.
@ DasIch:
Werds mir merken und in Zukunft hoffentlich weniger kontraproduktive Codeschnippsel posten

MfG Jonas
PS: Ist der Threadsteller überhaupt noch an einer Lösung interessiert oder
hat er bereits eine gefunden, die sein Problem entsprechend löst und hat sie nur noch nicht hier gepostet/will sie nicht hier posten?