|
|
|
Проблема с ByteBuffer
|
|||
|---|---|---|---|
|
#18+
Добрый день,Уважаемы Форумчане. Разрабатываем очередной кроссплатформенный драйвер для очередной модели весов. Есть определённое успешно эксплуатируемое в продакшине некое клише("рыба-шаблон") для драйвера: 1.Весы в comport отправляют цепочку байт(где содержится информация о весе цене устойчивости и т.д). 2.Они(байты ) кладутся в ByteBuffer 3.Далее в другом потоке парсер в соответствии с протоколом весов распознают нужную информацию и отправляет её в OC. 4.И далее ByteBuffer очищается методом clear Многое оборудование так успешно работает. Но вот появилось оборудование которое просто спамит в rs-232. (4-5 раз в секунду и по 128 байт). Тех.условия подбираются так чтобы один "выхлоп"(пакет) весов равнялся 1/4 ByteBuffer limit.(Впрочем этот показатель не так важен) Главное,что парсеру п3 может прийти на анализ несколько "выхлопов"(пакетов). и парсер последний(старший) пакет анализирует. И 2-3 часа драйвер работает правильно,а потом начинает проскальзывать старые данные.(как будто бы clear не было) Трассируем.смотрим что поступает из rs-232 b и это же пишем в ByteBuffer делаем println. Потом смотрим что парсит и выясняется (Напоминаю...это через пару часов работы) Пришло <пакет с весом 1> Должно быть в ByteBuffer(и так и есть первые часы) <пакет с весом 1>0x00 0x00 000000000000(до лимита) а после 1.5-3часов работы <пакет с весом 1><пакет с весом старым>0x00 0x00 0000000(до лимита) НЕ ВСЕГДА...а где-то каждую 100-150 итерацию. (Т.е это мерцающая поломка...что называется ужас инженера) читаю статью http://stackoverflow.com/questions/11197875/fast-erase-not-clear-a-bytebuffer-in-java там рекомедуют bytebuffer.put(byte[]) Делаем ByteBuffer.clear();bytebuffer.put(byte[]); Наработка на сбой возрасла до 12 часов .(От 12 до 15)...Но всё равно лажа. Читаю документацию https://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html#clear() Написано вот это. This method does not actually erase the data in the buffer, but it is named as if it did because it will most often be used in situations in which that might as well be the case. Давайте сверим позиции. This method does not actually erase the data in the buffer Это я перевожу как метод фактически не удаляет данные из буфера(Тут у меня вообще "взрыв мозга"....а нафиг он вообще этот метод нужен). Воторую часть я так и не смог точнг перевести , but it is named as if it did because it will most often be used in situations in which that might as well be the case. Какой-то набор слов "типа это иметь место". :-) Вот...у кого какие будут соображения.? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 20:53 |
|
||
|
Проблема с ByteBuffer
|
|||
|---|---|---|---|
|
#18+
Насколько я помню NIO API, подготовку к записи новых данных после считывания уже имеющихся делает Buffer.flip() Проще всего сделать два буфера, чтобы не возиться с переходом на начало буфера, когда считываются данные "у верхней границы". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 21:11 |
|
||
|
Проблема с ByteBuffer
|
|||
|---|---|---|---|
|
#18+
Можно, кстати, обернуть в байтовые буферы два региона одного массива - тогда этот массив станет циклическим буфером. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 21:17 |
|
||
|
Проблема с ByteBuffer
|
|||
|---|---|---|---|
|
#18+
Ваша проблема возникает, скорее всего, как раз из-за использования clear(). Если между очередными чтениями устройство успеет "накидать" больше данных, чем может поместиться в буфера - возникнет переполнение, которое вы не обрабатываете. "По моему так" (ц) Винни-Пух ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 21:24 |
|
||
|
Проблема с ByteBuffer
|
|||
|---|---|---|---|
|
#18+
Basil A. SidorovВаша проблема возникает, скорее всего, как раз из-за использования clear(). Если между очередными чтениями устройство успеет "накидать" больше данных, чем может поместиться в буфера - возникнет переполнение, которое вы не обрабатываете. "По моему так" (ц) Винни-Пух Не переполнения нет....Иначе бы owerflow exeption было бы. Как правило я имею задел 4 пакета. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 21:48 |
|
||
|
Проблема с ByteBuffer
|
|||
|---|---|---|---|
|
#18+
Если не пользоваться: Код: sql 1. , то зачем вообще NIO? Если пользоваться, то в логически простом коде можно сделать массу логических же ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2014, 21:55 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38808871&tid=2126252]: |
0ms |
get settings: |
5ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
137ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
25ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 384ms |

| 0 / 0 |
