Задать вопрос
Brodyaga
@Brodyaga

Java: время на обдумывание

Приветствую всех.
Никогда раньше не писал на Java, а тут вышла необходимость писать тестирующую систему. Собственно единственная возникшая проблема в том, что
1) нужно вывести вопрос
2) дать пользователю пять секунд на ответ
3) если пользователь в течение этого времени ввел число, сразу перейти к следующему вопросу
4) если не ввел, программа должна понять что ответа дано не было и перейти к следующему вопросу.
Ответы я считываю Scanner'ом, и не могу понять, как обойти то, что он блокирует поток на командах вида next*() и hasNext*() до получения символа перевода строки. Прошу java профессионалов помочь :)
  • Вопрос задан
  • 2933 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
kekekeks
@kekekeks
В отдельный поток вынести не пробовали?
На жаве не пишу, мимо проходил
Ответ написан
@Stepuk
Попробуйте использовать таймер. Он по умолчанию работает в фоновом потоке.
download.oracle.com/javase/6/docs/api/java/util/Timer.html
Ответ написан
Комментировать
Brodyaga
@Brodyaga Автор вопроса
В общем пока решил следующим образом:
public static Integer readWithTimeout(int secs) {
		Integer answer_given = null;
		Scanner in = new Scanner(System.in);
		if (secs != 0) {
			secs *= 1000;
			BufferedReader inReader = new BufferedReader(new InputStreamReader(
					System.in));
			long time = System.currentTimeMillis();
			try {
				while (System.currentTimeMillis() - time < secs) {
					if (inReader.ready()) {
						answer_given = in.nextInt();
						break;
					}
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			answer_given = in.nextInt();
		}
		return answer_given;
	}

Другое дело что если во время одного вопроса написать число, но не добавить перенос строки, и во время одного из последующих вопросов нажать Enter, старый текст будет записан как ответ на текущий вопрос. Как очищать буфер от залежавшихся там символов?
Ответ написан
Комментировать
apangin
@apangin
Java тут ни при чем, это особенности консольного ввода-вывода.
С той же самой проблемой столкнетесь, если станете использовать scanf, fread и т.п. на C++, PHP и многих других языках.
Если хотите получить нормальный пользовательский интерфейс, переходите сразу к GUI-тулкитам: AWT, Swing или SWT.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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