2013-05-16 8 views
19

devo scrivere un programma in corso di rete che è qualcosa come ripetizione selettiva ma un bisogno di un timer. dopo la ricerca in google ho trovato che Threading.Timer mi può aiutare, ho scritto un semplice programma solo per la prova di come Threading.Timer lavoro che è stato questo:threading.Timer()

import threading 

def hello(): 
    print "hello, world" 

t = threading.Timer(10.0, hello) 
t.start() 
print "Hi" 
i=10 
i=i+20 
print i 

questo programma funzionare correttamente. ma quando provo a definire la funzione ciao in un modo che dà dei parametri come:

import threading 

def hello(s): 
    print s 

h="hello world" 
t = threading.Timer(10.0, hello(h)) 
t.start() 
print "Hi" 
i=10 
i=i+20 
print i 

il fuori messo è:

hello world 
Hi 
30 
Exception in thread Thread-1: 
Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 522, in __bootstrap_inner 
    self.run() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/threading.py", line 726, in run 
    self.function(*self.args, **self.kwargs) 
TypeError: 'NoneType' object is not callable 

Non riesco a capire qual è il problema! qualcuno può aiutarmi?

risposta

47

Hai solo bisogno di mettere gli argomenti per hello in una voce separata nella chiamata di funzione, in questo modo,

t = threading.Timer(10.0, hello, [h]) 

Si tratta di un approccio comune in Python. In caso contrario, quando si utilizza Timer(10.0, hello(h)), il risultato di questa chiamata di funzione viene passato a Timer, ovvero None poiché hello non esegue un reso esplicito.

+0

grazie mille :) – sandra