Что касается ваших вопросов:
t.cancel()
(остановите таймер и не вызывайте функцию) вместо t.join()
(дождитесь окончания потока; это конечно, ВСЕГДА приведет к тайм-ауту) while
и прервите его, как только вы знать, что ввод действителен ...
В общем, может быть проще обернуть структуру программы - пусть основной поток обрабатывает таймаут и проверку ввода, пусть поток обрабатывает только ввод (таким образом, легко убить поток, чтобы остановить обработку ввода).
Конечно, используя модуль 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()
Делает задачу javac в Вашем файле типа "build", имеют fork="yes"
? В противном случае затем это не имеет значения что java.home
свойство установлено на; муравей попытается назвать javac Main
метод в том же процессе Java, который от Вашей ошибки является JRE, не JDK.
Установка Try РЕДАКТИРОВАНИЯ executable
свойство Вашей задачи javac к полному пути к javac
двоичный файл и добавляет compiler="extJavac"
к задаче.
Разве обратные косые черты не должны быть удвоены?
p.setProperty("java.home", "C:\\Program Files\\Java\\jdk1.6.0_04");
Вы установили переменные среды JAVA_HOME и ANT_HOME правильно? Если Вы устанавливаете с помощью кода, он должен работать все же.
Также проверьте, должен ли Ваш %JAVA_HOME %\bin каталог %ANT_HOME %\bin быть в переменной среды 'путем'.
Ваша проблема, кажется, с %JAVA_HOME %\bin не присутствующий в envt. пути переменной все же.