Seite 1 von 1

threading.Timer NoneType-Problem

Verfasst: Montag 16. Juni 2008, 20:10
von DANIone
Hallo zusammen:)

Schon wieder ein problem meinerseits und zwar diesmal mit der Timerfunktion!

Man sehe sich dieses einfache Script an:

Code: Alles auswählen

import threading

def hello():
    print "hello, world"

t = threading.Timer(5.0, hello())
t.start()
Das erste Mal schreibt er hello, world aber nach weiteren 5 Sekunden bekomme ich folgende Fehlermeldung:

Exception in thread Thread-1:
Traceback (most recent call last):
File "C:\Program Files\Python\lib\threading.py", line 486, in __bootstrap_inner
self.run()
File "C:\Program Files\Python\lib\threading.py", line 663, in run
self.function(*self.args, **self.kwargs)
TypeError: 'NoneType' object is not callable

Ich sehe meinen Fehler einfach nicht!

Danke schonmal für eure Hilfe!

Re: threading.Timer NoneType-Problem

Verfasst: Montag 16. Juni 2008, 20:17
von Mr. Kanister
DANIone hat geschrieben:

Code: Alles auswählen

t = threading.Timer(5.0, hello())
Du musst bei "hello" die Klammern weglassen, da du ja nicht das Ergebnis einer Funktion, sondern eine Referenz auf diese übergeben musst. Dann funktionierts auch ;)

Gruß Martin

Verfasst: Montag 16. Juni 2008, 20:26
von DANIone
Ja das leuchtet ein:)...Dankeschön!

Allerdings gibt es ja jetzt das Problem, dass er nach einmaligem printen von hello,world das programm beendet und der timer somit irgendwie nutzlos ist!

Denn eigentlich soll er ja immer weiter machen mit dem hello,world ausgeben!

Ich hab es dann so probiert(ja ich weiß das ist nicht schön!):

Code: Alles auswählen

def hello():
    print "hello, world"
    
t = threading.Timer(5.0, hello)
t.start()

raw_input('Zum Beenden Taste drücken')
Das Programm beendet dann zwar nicht, aber es gibt trotzdem nur einmal hello, world aus!

Irgendwelche Vorschläge damit das mit dem mehrmaligen Ausgeben funktioniert?!

Danke schonmal!

Verfasst: Montag 16. Juni 2008, 20:37
von Mr. Kanister
Schau dir mal die paar Seiten zum Modul "threading" im openbook Python auf http://www.galileocomputing.de/openbook ... 3633b5d48b
an. Dort wird sehr ausführlich die Implementation von Threads erklärt; unter anderem auch, wie man ein Programm, das Threads nutzt, ordnungsgemäß beendet.

Gruß Martin

Verfasst: Montag 16. Juni 2008, 21:24
von DANIone
Hmm ja ich habs mir angesehen und mal versucht es anzuwenden teilweise.

Zwar gibt er jetzt alle 5 Sekunden hello,world aus aber wenn ich zwischendurch aufs IDLE klicke hängt sich python auf...(bei der Eingabeaufforderung nicht!)

Woran liegt das?

Code: Alles auswählen

import threading

def hello():
    print "hello, world"

x = 1
while x == 1:
    my_timer = threading.Timer(5.0, hello)
    my_timer.start()
    my_timer.join()
Ist diese Variante jetzt in Ordnung so?
Kommt mir irgendwie zu kompliziert vor für mein Problem!

Hat jemand eventuell einen anderen Vorschlag wie ich eine Aktion alle x Sekunden ausführen kann??

Danke für eure Hilfe!

Verfasst: Montag 16. Juni 2008, 21:56
von cofi
Kleiner Tipp: Schau dir Bitte mal PEP8 an - gibt ja nun auch ne deutsche Übersetzung von mir dazu ;) *hust* - macht den Code IMHO weit lesbarer.

So zum Problem.

Sofern das Threading nich wichtig is wäre:

Code: Alles auswählen

from time import sleep

while True:
    do_foo()
    sleep(x)  #Hier natürlich deine Zeit anpassen ;)
Sollte aber kein Problem sein das auf Threading zu übertragen.

Verfasst: Dienstag 17. Juni 2008, 14:33
von Mr. Kanister
Kommt mir irgendwie zu kompliziert vor für mein Problem!
Die Frage ist ja, ob es dir primär darum ging die Funktionalität von Threads auszuprobieren oder ob es wirklich nur um eine Wartezeit geht.

Wenn es nur ums warten geht, dann reicht der Ansatz von cofi völlig aus. Wenn es dir um die Threads ging, dann ist dein Ansatz vollkommen in Ordnung :).

Gruß Martin

Verfasst: Dienstag 17. Juni 2008, 21:24
von DANIone
Ja mit time.sleep hab ich es vor der threading Variante schonmal probiert gehabt, jedoch taucht dort dasselbe Problem auf, nämlich dass sich die Python IDLE beim Ausführen des Scripts aufhängt!

In der Eingabeaufforderung passiert dies nicht und das Script macht was es machen soll ohne sich aufzuhängen:)

Code: Alles auswählen

import time

while True:
    print 'bla'
    time.sleep(5)
Kann man das sich Aufhängen der IDLE irgendwie verhindern?

Verfasst: Dienstag 17. Juni 2008, 21:39
von cofi
Folgendes: Du erzeugst damit eine Endlosschleife. Wenn du eine Endlosschleife willst, dann benutze doch bitte

Code: Alles auswählen

 while True: ..
Und keine Variable extra dafür.

Der Code funktioniert bei mir prima. Eventuell verhindert IDLE die Ausführung, da das Programm sich nicht selbst beenden kann. Aber so sehr kenn ich mich nicht mit IDLE aus. Versuchs mal über den Aufruf ``python $datei ''