2016-08-12 2 views
0

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

for (int i = 1; i <= 10; i++) { 
    serialPort.writeInt(i); 
// wait until SerialPortEventListener receives something then write again 
    } 

или:

void writeMoreDate(){ 
     serialPort.writeInt(something); 
    // wait until SerialPortEventListener receives something then write again 
     serialPort.writeInt(something; 
    // wait until SerialPortEventListener receives something then write again 
     serialPort.writeInt(something); 
} 

И у меня есть Serial Port Event Listener, что пожары каждый раз, когда я пишу что-то к нему, и называет .map() метод.

@Override 
    public void serialEvent(SerialPortEvent event) { 
     if (event.isRXCHAR() && event.getEventValue() > 0) { 

//when data arrived do something and notify that next method can execute!    
     } 
    } 

Как я могу заставить метод ждать, пока serialEvent не получит что-то?

-Этот как я не обрабатываются этого до сих пор с помощью java.util.concurrent.Semaphore:

экс:

Semaphore semaphore = new Semaphore(MAX_CONCURRENT_THREADS, true); 

     void writeMoreDate(){ 
      Runnable runnable() -> { 
      serialPort.writeInt(something); 
      semaphore.acquire(); 
      serialPort.writeInt(something; 
      semaphore.acquire(); 
      serialPort.writeInt(something); 
      semaphore.acquire(); 
      } 
       new Thread(runnable).start(); 
      } 

и на последовательный СЛУШАТЕЛЬ:

@Override 
    public void serialEvent(SerialPortEvent event) { 
     if (event.isRXCHAR() && event.getEventValue() > 0) { 
       semaphore.release(); 
     } 
    } 

Но я не уверен, что это правильное решение. Благодарю.

+0

Обычно, если вы хотите ждать, пока вы не получили некоторые данные, вы бы не использовать для цикла. Скорее всего, вы будете писать свой вызов в слушателе при уведомлении. – ControlAltDel

+0

Мне нужно записать фоновое изображение ISO в последовательный порт, записывая 128 байтов в раз в цикл for. После каждой записи слушатель подтверждает, что все в порядке, и это флаг для отправки еще 128 байт. Вот почему мне это нужно в цикле for. – Mardari

+0

Итак, прочитайте, пока у вас не будет 128 байт, а затем напишите этот фрагмент. Почему это проблема? – ControlAltDel

ответ

0

Я бы постарался сделать это немного рекурсивно вместо использования цикла for. Что-то вдоль линий:

private int activeIndex = -1; 
private int maxIndex = -1; 

private void write(int currentIndex, int maxIndex){ 
    if(maxIndex < currentIndex) 
     return; 

    activeIndex = currentIndex; 
    maxIndex = maxIndex; 

    serialPort.writeInt(currentIndex); 
} 

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

public void serialEvent(SerialPortEvent event) { 
    if (event.isRXCHAR() && event.getEventValue() > 0) { 
     ..... 

     write(activeIndex + 1, maxIndex); 
    } 
} 

Было бы гораздо чище, если бы вы могли каким-то образом передают текущие/максимальные индексы через SerialPortEvent вместо использования переменных класса для хранения данных, но я недостаточно знаком с этими классами, чтобы узнать, возможно ли это.

Таким образом, из вашего примера, вы можете использовать его с:

write(0, 10); 
+0

Я редактировал вопрос, мой плохой с объяснением, взгляните, если сможете. Спасибо за ваше время. – Mardari

+0

Я думаю, что мое решение по-прежнему относится к вашему вопросу. Он будет рекурсивно ждать, пока не будет вызван serialEvent (SerialPortEvent), прежде чем писать следующее, что является синхронным – Guardanis

Смежные вопросы