2009-02-09 5 views
0

Je suis en train de faire quelque chose comme ça en pythonet problème de fil, python

class MyThread (threading.Thread): 
    def run (s): 
     try: 
      s.wantQuit = 0 
      while(not s.wantQuit): 
       button = raw_input() 
       if button == "q": 
        s.wantQuit=1 
     except KeyboardInterrupt: 
      s.wantQuit = 1 

myThread = MyThread() 
myThread.start() 

a=5 
while not myThread.wantQuit: 
    print "hey" 
    if (a == 0): 
     break; 
    a = a-1; 
    time.sleep(1) 
#""" 
sys.exit() 

Ce qui se passe est mes cheveux app pendant 5 secondes d'impression « hey » (5 fois) Puis-je obtenir la boîte de dialogue raw_input. Comment puis-je avoir la boîte de dialogue pour que je puisse quitter à tout moment au lieu de la fin de ma boucle?

+0

Vous voulez donc l'imprimer et l'insérer en même temps? –

Répondre

1

vous voulez dire que la boucle while se poursuit avant que le fil? Eh bien, vous ne pouvez pas prédire cela, sauf si vous le synchronisez. Personne ne vous garantit que le thread s'exécutera avant ou après cette boucle while. Mais si cela est bloqué pendant 5 secondes, c'est que le fil devrait avoir été préempté d'ici là. De plus, puisque vous utilisez wantToQuit pour la première fois dans la méthode run(), personne ne vous assure que le thread a été démarré lorsque vous recherchez l'attribut wantToQuit dans while not myThread.wantToQuit.

0

juste essayé le code pour vous assurer, mais cela fait ce qu'il est censé ... vous pouvez taper q et entrer dans la console et faire quitter l'application avant a = 0 (donc il dit moins de 5 fois)

Je ne sais pas ce que vous entendez par le dialogue raw_input, raw_input normalement juste prend informations du stdin

1

Le comportement ici n'est pas ce que vous avez décrit. Regardez ces sorties d'échantillons je me suis:

1er: en appuyant sur q<ENTER> aussi vite que possible:

hey 
q 

2: attendre un peu avant d'appuyer sur q<ENTER>:

hey 
hey 
hey 
q 

3: Ne pas appuyez sur le clavier:

hey 
hey 
hey 
hey 
hey 
hey 
# Application locks because main thread is over but 
# there are other threads running. add myThread.wantQuit = 1 
# to prevent that if you want 
0

huperboreean a ta réponse. Le thread est toujours en cours de démarrage lorsque la boucle for est exécutée.

Vous voulez vérifier qu'un thread est démarré avant de passer dans votre boucle. Vous pouvez simplifier le thread pour surveiller raw_input, et revenir quand un 'q' est entré. Cela va tuer le fil.

Votre boucle principale peut vérifier si le thread est actif.