Funktion alle 5min wiederholen stürzt ab...

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.
Antworten
Crady
User
Beiträge: 18
Registriert: Freitag 31. Oktober 2008, 18:58

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?
Crady
User
Beiträge: 18
Registriert: Freitag 31. Oktober 2008, 18:58

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...
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

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?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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?!
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Was macht denn diese Funktion, die alle 5 Minuten laufen soll bzw. das ganze Skript?
Mad-Marty
User
Beiträge: 317
Registriert: Mittwoch 18. Januar 2006, 19:46

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.
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

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
Zuletzt geändert von jonas am Dienstag 18. November 2008, 18:32, insgesamt 1-mal geändert.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

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 :D
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
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.
Benutzeravatar
jonas
User
Beiträge: 156
Registriert: Dienstag 9. September 2008, 21:03

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?
Antworten