2012-08-22 26 views
5

Estoy tratando de lograr una forma de engendrar un hilo que espera la entrada del usuario; si no se ingresa ninguna entrada dentro de los 10 segundos, quiero que el script elimine el hilo generado y continúe con el procesamiento. Tengo una forma de recuperar la entrada del hilo si se ingresa texto, pero no tengo forma de dejar que el tiempo de espera elimine el hilo recién generado.esperando la entrada del usuario en un hilo separado

En el siguiente ejemplo, es lo más cerca que he llegado. Le digo al hilo recién creado que es un daemon y que saldrá cuando salga el script principal. El problema que tengo con esto es que el hilo continuará esperando hasta que el script salga o el usuario haya ingresado algo.

shared_var = ['1'] 
def run(ref): 
    ref[0] = raw_input("enter something: ") 
    print "shared var changed to '%s'" % (ref[0]) 

thread = threading.Thread(target=run, args=(shared_var,)) 
thread.daemon = True 
thread.start() 
time.sleep(10) # simplified timeout 

#Need some way to stop thread if no input has been entered 
print "shared var = " + shared_var[0] 

que conozco bruscamente matar a un hilo no es el mejor camino a seguir (Related Link), pero no sé cómo interrumpir el nuevo hilo de espera en el raw_input

Respuesta

3

Parece que no hay ninguna manera de la entrada del usuario de tiempo. En el enlace que proporcionó SmartElectron, la solución no funciona, ya que el cronómetro se detiene una vez que se solicita raw_input.

mejor solución hasta ahora es:

# Declare a mutable object so that it can be pass via reference 
user_input = [None] 

# spawn a new thread to wait for input 
def get_user_input(user_input_ref): 
    user_input_ref[0] = raw_input("Give me some Information: ") 

mythread = threading.Thread(target=get_user_input, args=(user_input,)) 
mythread.daemon = True 
mythread.start() 

for increment in range(1, 10): 
    time.sleep(1) 
    if user_input[0] is not None: 
     break 
1

en su caso, don' Te preocupes por cerrar el hilo abruptamente. En el enlace, digamos

En general, es un mal patrón para matar un hilo abruptamente, en python y en cualquier idioma. Piense en los siguientes casos:

  • el hilo está llevando a cabo un recurso crítico que debe ser cerrada.
  • el hilo ha creado varios otros hilos que también deben eliminarse.

Cerrar base de datos de conexión, los archivos abiertos, etc. recursos que necesita ser bien cerradas, en estos casos se cierran correctamente el hilo es fundamental. En este caso la solución es válida. *

Si esta solución no satisface puede utilizar How to set time limit on input

Cuestiones relacionadas