2009-02-16 11 views
2

dans mon code je boucle bien raw_input() pour voir si l'utilisateur a demandé de quitter. Mon application peut quitter avant que l'utilisateur ne quitte, mais mon problème est que l'application est encore en vie jusqu'à ce que j'entre une clé pour retourner à partir de la fonction de blocage raw_input(). Puis-je faire pour forcer raw_input() à revenir? en envoyant peut-être une fausse entrée? pourrais-je terminer le fil sur son? (les seules données qu'il a est un seul appel var wantQuit).python quitte un thread de blocage?

+0

Exemple de code serait bien. – codeape

Répondre

2

Vous pouvez utiliser cette fonction de temporisation qui enveloppe votre fonction. Voici la recette de: http://code.activestate.com/recipes/473878/

def timeout(func, args=(), kwargs={}, timeout_duration=1, default=None): 
    '''This function will spwan a thread and run the given function using the args, kwargs and 
    return the given default value if the timeout_duration is exceeded 
    ''' 
    import threading 
    class InterruptableThread(threading.Thread): 
     def __init__(self): 
      threading.Thread.__init__(self) 
      self.result = default 
     def run(self): 
      try: 
       self.result = func(*args, **kwargs) 
      except: 
       self.result = default 
    it = InterruptableThread() 
    it.start() 
    it.join(timeout_duration) 
    if it.isAlive(): 
     return it.result 
    else: 
     return it.result 
+0

Nice. Confirmé pour travailler dans WinXP et Linux. – Deestan

+2

Ce code est un mensonge: le InterruptableThread n'est en effet pas interrompu. Il va bloquer l'un ou l'autre chemin et rester pour toujours. Il devrait au moins être marqué comme thread de démon afin qu'il n'arrête pas l'interpréteur de quitter. Quelqu'un a déjà remarqué le problème: http://code.activestate.com/recipes/473878/#c3 – Bluehorn

2

Vous pouvez utiliser une fonction non bloquante pour lire les entrées utilisateur.
Cette solution est spécifique à Windows:

import msvcrt 
import time 

while True: 
    # test if there are keypresses in the input buffer 
    while msvcrt.kbhit(): 
     # read a character 
     print msvcrt.getch() 
    # no keypresses, sleep for a while... 
    time.sleep(1) 

Pour faire quelque chose de similaire dans Unix, qui lit une ligne à la fois, contrairement à la version Windows lecture omble chevalier par char (grâce à Aaron Digulla pour fournir le lien vers la python forum utilisateur):

import sys 
import select 

i = 0 
while i < 10: 
    i = i + 1 
    r,w,x = select.select([sys.stdin.fileno()],[],[],2) 
    if len(r) != 0: 
     print sys.stdin.readline() 

Voir aussi: http://code.activestate.com/recipes/134892/

+0

+1 pour prendre le temps d'écrire un exemple :) –

1

Il y a un post on the Python mailing list qui explique comment faire pour Unix:

# this works on some platforms: 

import signal, sys 

def alarm_handler(*args): 
    raise Exception("timeout") 

def function_xyz(prompt, timeout): 
    signal.signal(signal.SIGALRM, alarm_handler) 
    signal.alarm(timeout) 
    sys.stdout.write(prompt) 
    sys.stdout.flush() 
    try: 
     text = sys.stdin.readline() 
    except: 
     text = "" 
    signal.alarm(0) 
    return text 
+0

Merci, j'ai ajouté un petit exemple dans ma réponse basée sur ce post (+1) –

+0

404 sur le lien – jonasl

+0

Merci . Correction du lien et copie de la source ici. –

6

Pourquoi ne pas simplement marquer le fil comme daemonic?

De l'docs:

Un fil peut être marqué comme un « thread démon ». La signification de ce drapeau est que tout le programme Python se ferme lorsque seuls les threads démons sont laissés. La valeur initiale est héritée du thread de création. Le drapeau peut être défini via l'attribut daemon.

Questions connexes