Я новичок в программировании на JAVA.Мне было поручено написать приложение JAVA GUI, которое будет взаимодействовать с внешними устройствами через последовательный порт.Мне удалось заставить мой код компилироваться и запускаться с помощью пакета jSSC (Java Simple Serial Connector) как на Mac OS X, так и на платформе Win32.Проект jSSC предоставляет приличные примеры кодов, и его довольно легко реализовать с помощью интерфейса SerialPortEventListener в стиле javax.comm.
Но вскоре я понял, что мне нужно добавить функцию "ACK timeout" в мою реализацию, дляпредотвращение ошибок.В языке Си это может быть легко достигнуто с помощью вызова API select () с 5-м параметром, динамически устанавливающим желаемую длительность.Но в JAVA я не имею ни малейшего понятия, как это сделать.
Должен ли я установить другой поток времени и запустить событие, сгенерированное таймером, напрямую вызывая метод serialEvent ()?Это может привести к некоторым гоночным условиям.
(27.03. 10:43 Редактировать): ОК, я проследил исходный код jSSC.Казалось, что jSSC просто создает новый поток Runnable в JVM, когда в него зарегистрирован прослушиватель;и этот поток будет непрерывно опрашивать состояние с помощью вызова собственной функции, который будет вызывать системные вызовы API, такие как ioctl ().Так что было бы невозможно добавить событие тайм-аута без изменения собственной библиотеки.
Думаю, мне нужно изменить способ обработки событий последовательного порта.Мне нужно будет создать другой поток Runnable для обработки входящего процесса данных, вместо непосредственного анализа данных в вызове метода serialEvent () из потока событий jSSC.И я могу настроить таймер для выброса события тайм-аута в этот поток.
В этом случае мне нужно будет настроить поток диспетчеризации событий, как SwingUtility.invokelater ().Но я понятия не имею, должен ли я реализовать его снизу вверх, или я могу просто использовать AWT EDT для его обработки.
Может кто-нибудь дать мне какой-нибудь совет?