Piszę program szachowy w Javie. GUI powinien być w stanie komunikować się z silnikiem szachowym obsługującym Protokół komunikacyjny silnika szachowego. Ale mam pewne trudności z pogodzeniem protokołu z funkcjami I/O Javy.

Ponieważ silniki starsze niż wersja 2 protokołu nie wysyłają „funkcji”, xboard używa mechanizmu limitu czasu: kiedy po raz pierwszy uruchamia silnik, wysyła „xboard” i „protover N”, a następnie nasłuchuje poleceń funkcji przez dwie sekundy przed wysłaniem jakichkolwiek innych polecenia.

Wydaje się, że możliwości Javy do przerywania operacji I/O są ograniczone. Jedyną opcją, jaką mogę znaleźć, jest InterruptibleChannel NIO, która zamyka się, gdy zostanie przerwana.

Nie chcę, aby strumień się zamykał po przekroczeniu limitu czasu — chcę tylko przerwać odczyt. Czy ktoś zna rozwiązanie?

1
Masterofpsi 20 czerwiec 2011, 09:14

2 odpowiedzi

Najlepsza odpowiedź

Myślę, że możesz za dużo przemyśleć problem. Nie musisz przerywać wywołania read() po 2 sekundach, potrzebujesz tylko logiki kopii zapasowej, aby zrozumieć, że po 2 sekundach nie powinien oczekiwać odebrania żadnych poleceń „funkcji”. Wtedy twoja implementacja może napisać następne polecenie, a twój read() zwróci bajt(y) z odpowiedzi na to polecenie.

Tak i tak bym do tego podszedł, mając kod generyczny, który odczytuje w bajtach i przekazuje je dalej w górę łańcucha, gdzie można wykonać przetwarzanie zależne od kontekstu. Wtedy nie musisz przerywać odczytu, kod nadrzędny musi tylko zrozumieć, że dane, które ostatecznie otrzyma z powrotem, mogą być poleceniem „funkcji”, a może nie.

4
aroth 20 czerwiec 2011, 09:21

Nie jest dla mnie jasne, że musisz coś zrobić. To, co zacytowałeś, to zachowanie limitu czasu tablicy. Nie musisz tego implementować, odbywa się to na tablicy, która jest równorzędna, tj. na drugim końcu.

2
user207421 22 czerwiec 2011, 14:42