Как обрабатывать время ожидания при чтении с помощью Java Comm API - PullRequest
1 голос
/ 12 апреля 2010

мое приложение использует интерфейс Java serial comm api. При чтении документов метод inputtream.read () блокируется, если нет доступных данных.

Я пытался установить время ожидания для объекта serialport, но методы isReceiveTimeoutEnabled () возвращают значение false, указывая, что мой драйвер изначально не поддерживает тайм-ауты.

Так, каков наилучший способ реализовать тайм-аут чтения, указанный выше?

Спасибо, Фред

Ответы [ 4 ]

1 голос
/ 12 апреля 2010

Вам понадобятся две темы.

Сторожевой поток будет следить за потоком чтения и прерывать его при обнаружении тайм-аута.

Пусть поток чтения сообщит потоку контроля, что он собирается начать чтение, и когда он завершит чтение.

Попросите сторожевой поток запустить таймер, когда начинается чтение, и прервать поток чтения, когда он истекает, или прекратить прослушивание на время, когда чтение завершено.

Читайте о потоке Java, если вы не знакомы с ним. Легко иметь многопоточную ошибку.

1 голос
/ 12 апреля 2010

С помощью метода InputStream.available () можно проверить, будет ли блокироваться следующая read().

1 голос
/ 12 апреля 2010

Если это не работает для вас, просто добавьте этот поток ввода в поток и реализуйте свое собственное время ожидания. Если время ожидания истекло, вызовите close () в потоке, чтобы разблокировать и закрыть этот поток

0 голосов
/ 13 апреля 2010

Вы также можете использовать SerialPortEventListener в качестве обратного вызова, чтобы получать уведомления о новых доступных данных и вызывать чтение только тогда, когда есть чем заняться.

final SerialPort serialPort = ...;
final InputStream in = serialPort.getInputStream();
serialPortal.notifyOnDataAvailable(true);
serialPort.addEventListener(new SerialPortEventListener() {
    public void serialEvent(SerialPortEvent event) {
        if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            // read from InputSteam
        }
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...