2016-02-25 1 views
0

Je travaille actuellement sur un projet où j'ai besoin d'envoyer des données via Serial de manière persistante, mais j'ai besoin de changer occasionnellement ces données en fonction de nouvelles entrées. Mon problème est que ma boucle actuelle fonctionne uniquement quand une nouvelle entrée est proposée par raw_input(). Rien ne s'exécute à nouveau jusqu'à ce qu'un autre raw_input() soit reçu.Comment garder une boucle While True en cours d'exécution avec raw_input() si les entrées sont rarement?

Ma boucle de courant (très amincie) ressemble à ceci:

while True: 
    foo = raw_input() 
    print(foo) 

Je voudrais que les dernières valeurs à imprimer (ou passer à une autre fonction) en permanence indépendamment de la fréquence des changements se produisent.

Toute aide est appréciée.

Répondre

0

Comment allez-vous taper vos données en même temps pendant l'impression des données? Cependant, vous pouvez utiliser le multithreading si vous vous assurez que votre source de données n'interfère pas avec votre sortie de données.

import thread 

def give_output(): 
    while True: 
     pass # output stuff here 

def get_input(): 
    while True: 
     pass # get input here 

thread.start_new_thread(give_output,()) 
thread.start_new_thread(get_input,()) 

Votre source de données pourrait être un autre programme. Vous pouvez les connecter en utilisant un fichier ou une socket.

+0

Pourquoi importer le thread si vous ne définissez aucun thread dans votre exemple de code? – jsfan

+0

Espérons que ça aide – Cosinux

+0

Ouais désolé. Je l'ai corrigé – Cosinux

1

Le module select (ou Python 3.4+, selectors) peut vous permettre de résoudre ce problème sans enfiler, tout en effectuant des mises à jour périodiques.

Fondamentalement, vous écrivez simplement la boucle normale mais utilisez select pour déterminer si de nouvelles entrées est disponible, et si oui, la saisir:

import select 

while True: 
    # Polls for availability of data on stdin without blocking 
    if select.select((sys.stdin,),(),(), 0)[0]: 
     foo = raw_input() 
    print(foo) 

Comme écrit, cela print beaucoup plus que vous voulez sans doute; vous pouvez soit time.sleep après chaque print, soit changer l'argument timeout en select.select pour autre chose que 0; Si vous le faites par exemple, vous mettrez à jour immédiatement lorsque de nouvelles données sont disponibles. Dans le cas contraire, vous devrez attendre une seconde avant d'abandonner et d'imprimer à nouveau les anciennes données.