Реализация таймера игровой памяти и обработка ошибок

Может быть полезно кому-то:

Если вы хотите использовать простые опции вместо ng-options, вы можете сделать это, как показано ниже:

<select ng-model="sortorder" ng-init="sortorder='publish_date'">
  <option value="publish_date">Ascending</option>
  <option value="-publish_date">Descending</option>
</select>

Установите модель в строке. Используйте ng-init, чтобы избавиться от пустой опции

0
задан Muppetshow12 27 March 2019 в 04:35
поделиться

1 ответ

Что касается ваших вопросов:

  1. Вы можете выполнить это с помощью t.cancel() (остановите таймер и не вызывайте функцию) вместо t.join() (дождитесь окончания потока; это конечно, ВСЕГДА приведет к тайм-ауту)
  2. (и 3.) Они в основном одинаковы - поместите сообщение запроса и всю обработку ввода в цикл while и прервите его, как только вы знать, что ввод действителен

...

  1. Кроме того, сообщение «время истекло» на самом деле не принесло ничего полезного (например, вы все равно можете ввести правильный ответ после истечения времени. Я «исправил» это грубым путем, сделав выход из программы, если истекло время ожидания. Вместо этого вы также можете использовать глобальную переменную для хранения информации о том, был ли достигнут таймаут или нет, и соответствующим образом обработать его в своем вводе (убедитесь, что он безопасен для потоков, например, с помощью мьютекса).

В общем, может быть проще обернуть структуру программы - пусть основной поток обрабатывает таймаут и проверку ввода, пусть поток обрабатывает только ввод (таким образом, легко убить поток, чтобы остановить обработку ввода).

Конечно, используя модуль select , можно реализовать это даже лучше без потоков (есть один канал, который записывается потоком / таймером и стандартным вводом, затем выбирает оба для чтения и блокирует до ввода пользователя или тайм-аута происходит).

А может кто-нибудь опубликует хорошее решение на основе asyncio ? ;)

Вот модифицированное решение (изменяя настолько мало, насколько это возможно, чтобы заставить его работать, можно реорганизовать другие части, чтобы сделать его лучше в целом):

import random                                                                                                            
import threading                                                                                                         
import os                                                                                                                

def timeout():                                                                                                           
    print("Time over\n#####################\n")                                                                          
    # You can't use sys.exit() here, as this code is running in a thread                                                 
    # See also: https://stackoverflow.com/a/905224/1047040                                                               
    os._exit(0)                                                                                                          

while True:                                                                                                              
    list = []                                                                                                            
    for i in range(5):                                                                                                   
        list.append(random.randint(1000, 10000))                                                                         

    t = threading.Timer(5, timeout)                                                                                      
    t.start()                                                                                                            

    print(list)                                                                                                          
    print('[ 1  ,  2  ,  3  ,  4  ,  5  ]')                                                                              

    solution = sorted(list)[2]                                                                                           
    while True:                                                                                                          
        try:                                                                                                             
            print('please select the 3rd largest number in this row (1-5):')                                             
            input_string = input()                                                                                       
            selection = int(input_string)                                                                                
            chosen = list[selection - 1]                                                                                 
            # If we arrive here, the input was valid, break out of the loop                                              
            break                                                                                                        
        except Exception as e:                                                                                           
            # Tell the user that the input is wrong; feel free to remove "e"                                             
            # from the print output                                                                                      
            print('Invalid input:', e)                                                                                   

    if solution == chosen:                                                                                               
        print("Your guess is correct\n")                                                                                 
    else:                                                                                                                
        print("Your guess is wrong\n")                                                                                   

    # Make sure to cancel the thread, otherwise guessing correct or wrong                                                
    # will block the CLI interface and still write "time out" at the end                                                 
    t.cancel()                                                                                                           
0
ответ дан Thomas Perl 27 March 2019 в 04:35
поделиться
Другие вопросы по тегам:

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