Java - прерывание ввода-вывода без закрытия - PullRequest
2 голосов
/ 20 июня 2011

Я пишу шахматную программу на Java.Графический интерфейс должен поддерживать связь с шахматным движком, поддерживающим протокол связи с шахматным движком .Но у меня возникают некоторые трудности при согласовании протокола с возможностями ввода-вывода Java.

Поскольку механизмы, предшествующие протоколу версии 2, не отправляют «функцию», xboard использует механизм тайм-аута: при первом запускеваш движок отправляет «xboard» и «protover N», затем слушает команды функций в течение двух секунд перед отправкой любых других команд.

Кажется, что возможности Java для прерывания операций ввода-вывода ограничены,Единственная опция, которую я могу найти - это NIO InterruptibleChannel, который закрывается при прерывании.

Я не хочу, чтобы поток закрывался, когда истекает время ожидания - я просто хочу прервать чтение.Кто-нибудь знает решение?

Ответы [ 2 ]

4 голосов
/ 20 июня 2011

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

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

2 голосов
/ 22 июня 2011

Мне не понятно, что вам нужно что-то делать много. Вы процитировали поведение тайм-аута платы. Вам не нужно реализовывать это, это делается на доске, которая является равноправной, то есть на другом конце.

...