2016-06-28 1 views
0

J'essaie d'utiliser la classe thread.Timer, mais je continue à avoir des plantages. Voici l'idée: j'ai un code qui lance une optimisation sur une application web. Lorsque l'optimisation est lancée, je souhaite envoyer des requêtes périodiques au serveur de l'application Web pour savoir si l'optimisation est terminée ou en cours d'exécution.Thread Timer émet des python

def checkPeriodically(self): 
    print "Sending a request" 
    finished = self.checkOptim() 
    if finished : 
     return 
    t = threading.Timer(60,self.checkPeriodically) 
    t.start() 

fonction Mon checkOptim utilise mécaniser pour se connecter à l'application et lire la page de résultat; Ensuite, il utilise un HTMLParser pour vérifier si l'optimisation est terminée ou non.

def checkOptim(self): 
    browser = mechanize.Browser() 
    browser.set_handle_refresh(True, honor_time=True, max_time=10) 
    browser.open('resultPageURL') 
    response = browser.response().read() 
    parser = MyHTMLParser(self.optimName) 
    parser.feed(response) 
    return parser.optimFinished 

Tout cela fait partie d'un plugin je suis en train d'écrire pour QGIS (SIG), mais je ne pense pas que le problème est lié au logiciel, il est probablement dû à moi de ne pas utiliser la classe de filetage correctement . Toute aide serait grandement appréciée.

Répondre

1

Je ne sais pas quel est le message d'erreur que vous avez, mais il se peut que l'objet dont la fonction checkPeriodically en fait partie n'existe plus.

Voici exemple de code de travail. (I "m référence de maintien de l'objet jusqu'à ce que tous les travaux sont faits)

import threading 
import time 

class cls: 
    def __init__(self): 
     pass 
     self.stop_if_zero = -10 

    def checkPeriodically(self): 
     print "Sending a request %s" % self.stop_if_zero 
     self.stop_if_zero +=1; 
     if 0 == self.stop_if_zero : 
      return 
     t = threading.Timer(2,self.checkPeriodically) 
     t.start()  

#create instance of the class 
st = cls() 
#start the thread with timer 
st.checkPeriodically(); 

while (0 > st.stop_if_zero): 
    # keep referance to ST untill it ends or else it might crashed. 
    time.sleep (0.1); 
+0

Vous aviez raison, le problème vient du fait que la ojet (classe) à partir de laquelle J'appelle "checkPeriodically" n'existe plus quand le timer se produit, provoquant le crash du logiciel Merci pour l'aide! – Ril8772