Comment puis-je implémenter une contribution utilisateur limitée dans le temps dans la programmation ?

DDD
Libérer: 2024-11-26 17:22:13
original
657 Les gens l'ont consulté

How Can I Implement Time-Limited User Input in Programming?

Saisie avec restriction de temps

En programmation, il peut être avantageux d'imposer une limite de temps à la saisie de l'utilisateur. Par exemple, vous souhaiterez peut-être poser une question aux utilisateurs et leur accorder une durée limitée pour répondre, par exemple :

print('some scenario')
prompt = input("You have 10 seconds to choose the correct answer...\n")
Copier après la connexion

Si l'utilisateur dépasse le délai imparti, vous pouvez afficher un message du type :

print('Sorry, times up.')
Copier après la connexion

Solutions pour une saisie limitée dans le temps

Pour mettre en œuvre une saisie limitée dans le temps, considérez ces options :

  • Blocage du thread principal : S'il est acceptable de bloquer l'exécution de votre code pendant que l'utilisateur fournit une entrée, vous pouvez utiliser un objet Timer :
from threading import Timer

timeout = 10
t = Timer(timeout, print, ['Sorry, times up'])
t.start()
prompt = "You have %d seconds to choose the correct answer...\n" % timeout
answer = input(prompt)
t.cancel()
Copier après la connexion
  • Entrée non bloquante (Windows) : Pour éviter de bloquer le thread principal, vous peut utiliser la méthode suivante sous Windows (notez que cette approche n'est pas testée) :
import msvcrt
import time

class TimeoutExpired(Exception):
    pass

def input_with_timeout(prompt, timeout, timer=time.monotonic):
    sys.stdout.write(prompt)
    sys.stdout.flush()
    endtime = timer() + timeout
    result = []
    while timer() < endtime:
        if msvcrt.kbhit():
            result.append(msvcrt.getwche())  # XXX can it block on multibyte characters?
            if result[-1] == '\r':
                return ''.join(result[:-1])
        time.sleep(0.04)  # just to yield to other processes/threads
    raise TimeoutExpired
Copier après la connexion
  • Entrée non bloquante (Unix) : Alternativement, sous Unix -systèmes basés sur les systèmes, vous pouvez utiliser l'une des approches suivantes :
import select
import sys

def input_with_timeout(prompt, timeout):
    sys.stdout.write(prompt)
    sys.stdout.flush()
    ready, _, _ = select.select([sys.stdin], [],[], timeout)
    if ready:
        return sys.stdin.readline().rstrip('\n')  # expect stdin to be line-buffered
    raise TimeoutExpired
Copier après la connexion
import signal

def alarm_handler(signum, frame):
    raise TimeoutExpired

def input_with_timeout(prompt, timeout):
    # set signal handler
    signal.signal(signal.SIGALRM, alarm_handler)
    signal.alarm(timeout)  # produce SIGALRM in `timeout` seconds

    try:
        return input(prompt)
    finally:
        signal.alarm(0)  # cancel alarm
Copier après la connexion

En mettant en œuvre ces méthodes, vous pouvez appliquer efficacement restrictions de temps pour la saisie de l'utilisateur, améliorant l'expérience utilisateur et contrôlant le flux de votre programme.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal