Могу ли я добавить ограничение времени для ввода пользователем? [Дубликат]

В версии Блоха используется Class.cast () , который реализован как return (T) obj , неконтролируемый актерский состав. Это обман в том смысле, что предупреждение компилятора о неконтролируемом акте перемещается в предварительно скомпилированную библиотеку lib. Тип безопасности броска не защищен компилятором, а логикой приложения.

Вы также не должны беспокоиться о неконтролируемом литье. Существуют типы отношений, которые не могут быть выражены на языке, но программисты знают, что это правда. Так что просто отмените компилятор, скажите, что бросок безопасен.

Исправление

Мое понимание о «непроверенном акте» было неверным.

Класс.cast () не содержит «непроверенный бросок». Приведение выполняется после «проверки», если приведение выполняется во время выполнения, это гарантировано.

  T cast (Object obj), если obj является экземпляром этого класса // check return (T) obj;  // cast else throw new ClassCastException  
7
задан cloud311 20 March 2013 в 18:42
поделиться

2 ответа

Интересная проблема: похоже, это работает:

import time
from threading import Thread

answer = None

def check():
    time.sleep(2)
    if answer != None:
        return
    print "Too Slow"

Thread(target = check).start()

answer = raw_input("Input something: ")
2
ответ дан mediocrity 17 August 2018 в 13:31
поделиться

Если допустимо блокировать основной поток, когда пользователь не предоставил ответа:

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()

В противном случае вы могли бы использовать ответ @Alex Martelli (измененный для Python 3) в Windows (не тестировалось):

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] == '\n':   #XXX check what Windows returns here
                return ''.join(result[:-1])
        time.sleep(0.04) # just to yield to other processes/threads
    raise TimeoutExpired

Использование:

try:
    answer = input_with_timeout(prompt, 10)
except TimeoutExpired:
    print('Sorry, times up')
else:
    print('Got %r' % answer)

В Unix вы можете попробовать:

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

Или:

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
11
ответ дан Community 17 August 2018 в 13:31
поделиться
  • 1
    Первый ответ печатался после таймаута, но вход все еще был доступен. – Eliezer Miron 12 July 2016 в 22:57
  • 2
    @EliezerMiron: да, вызов input() не прерывается в первом примере, поэтому есть: & quot; Если допустимо блокировать основной поток & quot; до примера. Если вам нужно interrtupt ввода, используйте следующие примеры с input_with_timeout(). – jfs 30 September 2016 в 20:00
  • 3
    Я попытался использовать import signal один, и его чувство времени, похоже, далеко. Я использую Cloud9 IDE. Если я дам ему тайм-аут .5, он будет ждать около 3 секунд до истечения времени. – Pro Q 3 February 2017 в 06:16
Другие вопросы по тегам:

Похожие вопросы: