Java: Observer или synchronized + notify () для входных данных последовательного порта - PullRequest
1 голос
/ 05 ноября 2010

У меня есть последовательный порт с поступающими данными. Я реализовал соединение через последовательный порт с библиотекой RXTX с помощью прослушивателя событий последовательного порта.Поэтому, когда в последовательный порт поступают входящие данные, запускается синхронизированная функция serialEvent (SerialPortEvent oEvent).В основном программа будет в бесконечном цикле, поскольку данные поступают непрерывно.Я организовал входящие данные в массив целых чисел.Теперь я хочу, чтобы этот массив был доступен другим моим классам, которые будут использовать этот массив для выполнения других задач.Я могу сказать, что, поскольку прослушиватель последовательных событий работает в цикле, а массив постоянно меняется, я хочу, чтобы все другие классы совместно использовали эти измененные данные массива.Я узнал кое-что о java.util.observables раньше.И когда я выполняю поиск в Интернете, я вижу других людей, использующих sychronized () и notify () / notifyAll () для разделения переменной между потоками.

Я не уверен, какой из них лучше всего использовать?Если они оба работают в этом случае, что является наиболее важной частью, которую я должен знать?Есть ли еще какой-нибудь способ добиться того, чего я хочу?

Ответы [ 3 ]

0 голосов
/ 05 ноября 2010

Трудно сказать без дополнительной информации о вашем приложении. Когда вы говорите «другие классы», вы имеете в виду «другие темы»?

Если ваши другие классы являются потоками и вы хотите, чтобы они ожидали новых данных, вы можете иметь их wait() и иметь прослушиватель событий последовательного порта notifyAll() всякий раз, когда новые данные становятся доступными. Это разбудит темы, которые ждут. Но обратите внимание, что это только решает уведомление: вам все равно придется обрабатывать параллельный доступ к массиву данных, поскольку возможно, что новые данные поступают, когда другие потоки обращаются к нему.

С другой стороны, если вы используете Observable, то при вызове Observable.notifyObservers() это приведет к тому, что будет вызываться метод update() каждого Observer, все в контексте текущего потока ( поток, который вызывает Observable.notifyObservers()). Если вы хотите, чтобы другие потоки обращались к данным, вам все равно понадобится какой-то способ уведомить их (например, ваш метод update() может в конечном итоге вызвать notify()).

Если вы предоставите больше информации о том, что вы пытаетесь сделать, мы сможем помочь вам в дальнейшем.

0 голосов
/ 06 ноября 2010

Извините, что мой вопрос не был ясен.Я должен был дать код, с которым я работаю.пожалуйста, обратитесь к следующей ссылке:

http://www.arduino.cc/playground/Interfacing/Java

В основном этот пример кода отличается от тех классических примеров rxtx с основанной на событиях коммуникацией через последовательный порт, объявив ключевое слово «synchronized» в некоторых функциях.Единственная часть, над которой я работаю, находится в прослушивателе последовательных событий:

public synchronized void serialEvent(SerialPortEvent oEvent) {

    if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
        try {
            ////////////////////////////////////
            1) I will parse the incoming data into an integer array
            2) this array will be shared with other classes, let me
              explain some of them below.....
            ////////////////////////////////////
        } catch (Exception e) {
            System.err.println(e.toString());
        }
    }
}

Функция A: апплет, создающий 2D / 3D-графику с использованием данных в этом общем массиве.

Функция B: GUI будет выводить / печатать некоторые числа, вычисленные из общего массива, в текстовую область в jframe.Он также может открыть апплет функции A с помощью кнопки.Но есть некоторые кнопки в графическом интерфейсе, которые изменят некоторые переменные в функции A, чтобы вызвать другое поведение для обработки общего массива функцией A.

Это то, что я хочу:

Как последовательные данныевход и анализ в массив данных ....

1) Функция B немедленно напечатает числа, связанные с этим массивом данных.Только если пользователь нажмет кнопку, чтобы открыть апплет функции A, функция A отобразит 2D / 3D графику.

2) Когда обе функции A и B активны, их собственные переменные могут изменяться вместе свходящие последовательные данные.

Я хочу, чтобы функции A и B сразу же улавливали изменение в массиве общих данных при его изменении в serialEvent ().Я знаю, что самый простой способ - передать массив данных в качестве ссылки и вызвать каждую функцию до того, как станут доступными следующие входящие данные.Но есть проблема, упомянутая ранее Гродригес .Во время выполнения функции A или B могут быть потеряны некоторые входящие данные.Я что-то делал с MVC в Java несколько лет назад, и он использовал obervables между различными классами или GUI для отображения температуры.Как и при вводе температуры в текстовом поле, другой графический интерфейс с ползунком изменится на входную температуру.И поскольку я изменил ползунок здесь, он изменит температуру в номере в другом графическом интерфейсе.Серийное событие напоминает мне об этом приложении здесь.Я не уверен, является ли это лучшим методом для применения здесь, или могут быть другие лучшие и более простые способы сделать именно то, что я хочу.

Еще раз спасибо за ваше терпение.

0 голосов
/ 05 ноября 2010

Ваш вопрос ужасно неясен, но я могу дать вам один общий совет.

Простой способ использовать объект последовательного порта - открыть поток ввода или вывода и просто прочитать / записать байты.Материал события предназначен для случаев, когда вы не хотите, чтобы поток блокировал ожидание чтения данных.

Я предлагаю вам прочитать эти примеры RXTX , особенно первые два, которые иллюстрируютподходы на основе потоков и событий.

Если это не поможет, обновите вопрос с помощью некоторого кода Java или псевдокода, объясняющего, что вы пытаетесь сделать.

СЛЕДУЙТЕ ЗА

Судя по вашему "ответу", вы, похоже, неправильно понимаете, что делает synchronized.Проще говоря, просто останавливает выполнение двумя потоками одновременно определенных областей кода.

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

Я рекомендую вам начать с чтения потока Java Tutorial в Параллелизм.Это, вероятно, не решит вашу проблему напрямую, но поможет вам правильно подумать о проблеме.

...