Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/34: Рейтинг темы: голосов - 34, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92

Работа с кольцевым буфером

24.08.2020, 18:57. Показов 10133. Ответов 154
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, пытаюсь написать программу для usb осциллографа Hantek6204bc, понял, что если читать и сохранять данные в файл одном потоке, осциллограф может во время ожидания часть данных пропустить, поэтому решил чтение данных осциллографом запустить в отдельном потоке, соответственно запись данных в файл тоже в отдельном потоке. Осциллограф читает данные в кольцевой буфер и помечает участок буфера как записанный, переходит к следующему. После первого считывания, активируется поток записи в файл и записывает в файл помеченные участки буфера. Собственно наконец-то сам вопрос, поток чтения осциллографа, опережает поток записи в файл и в определенный момент обнуляет те данные которые поток записи собирается записать в файл, программа крашится. Как этого избежать? Или может в данном случае нужно использовать не кольцевой буфер?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.08.2020, 18:57
Ответы с готовыми решениями:

Очередь с кольцевым буфером
Добрый день. Решаю вобщем одну задачку, но сомневаюсь в правильности и оптимальности кода. Собственно задача: организовать очередь (по...

Работа с буфером обмена
В общем нужна программа, которая по клавише активации(например F10) считывала кол-во символов в буфере обмена и заменяла их другими...

Реализация 2х потоков, работа с буфером, механизм семафоров
Год не было С++, а теперь по смежному предмету задали вот такое : Написать программу, содержащую два потока. Первый поток генерирует...

154
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.08.2020, 19:36
Студворк — интернет-сервис помощи студентам
И ты смотрел, что у тебя возвращается в myControlData? Мне кажется, там должна быть какая-то важная информация

Добавлено через 1 минуту
Цитата Сообщение от MDmitry Посмотреть сообщение
Возможно, но точно сказать не могу, сам не уверен
Разберись, почитай документацию по прибору
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
28.08.2020, 19:37  [ТС]
Но ведь одна запись, это 4096 замеров, с паузами между ними заданными частотой дискретизации

Добавлено через 1 минуту
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Разберись, почитай документацию по прибору
Прибор китайский, все что мог поперечитал, а техподдержка ответила 3 раза, на четвертый сказали что у них типа нет прибора с таким серийным номером

В общем все равно сижу и пробую по разному
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.08.2020, 19:42
Цитата Сообщение от MDmitry Посмотреть сообщение
Но ведь одна запись, это 4096 замеров, с паузами между ними заданными частотой дискретизации
Я так понимаю, между двумя замерами должна быть такая же пауза, заданная частотой дискретизации. Чем это гарантируется при работе с одной записью?

Добавлено через 1 минуту
Цитата Сообщение от MDmitry Посмотреть сообщение
В общем все равно сижу и пробую по разному
Забей тогда пока на потоки и файлы. Научись работать с осциллографом на простенькой программке - запустить, прочитать сколько-то, проверить, что начиталось

Добавлено через 2 минуты
А то ты пытаешься сделать всё и сразу. В результате не работает ничего.
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
28.08.2020, 19:43  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Я так понимаю, между двумя замерами должна быть такая же пауза, заданная частотой дискретизации. Чем это гарантируется при работе с одной записью?

Добавлено через 1 минуту

Забей тогда пока на потоки и файлы. Научись работать с осциллографом на простенькой программке - запустить, прочитать сколько-то, проверить, что начиталось

Добавлено через 2 минуты
А то ты пытаешься сделать всё и сразу. В результате не работает ничего.
Наверное так и сделаю

Но есть еще вопрос, опять прочитал описание splice, что-то мне покоя не дает вот этакая строчка:
This effectively inserts those elements into the container and removes them from x, altering the sizes of both containers.

описание вот откуда брал: https://www.cplusplus.com/refe... st/splice/
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.08.2020, 19:47
Цитата Сообщение от MDmitry Посмотреть сообщение
Но есть еще вопрос, опять прочитал описание splice, что-то мне покоя не дает вот этакая строчка:
Здесь написано, что splice эффективно удаляет элемент из одного списка и добавляет его в другой. Размер списка из которого удаляют уменьшается на один элемент, а списка в который добавляют, наоборот, увеличивается на столько же.
Я вроде так и говорил. Что тебя смущает?
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
28.08.2020, 19:51  [ТС]
Меня смущает, что из одного удаляет, в другой записывает, в функции чтения data.splice(data.end(), buffers, buffers.begin());, после записи в файл buffers.splice(buffers.end(), data, data.begin());
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.08.2020, 20:01
Цитата Сообщение от MDmitry Посмотреть сообщение
Меня смущает, что из одного удаляет, в другой записывает, в функции чтения data.splice(data.end(), buffers, buffers.begin());, после записи в файл buffers.splice(buffers.end(), data, data.begin());
При чтении пишем с осцилографа в первый элемент списка buffers, затем удаляем его из buffers и помещаем в хвост списка data
При записи наоборот, сохраняем первый элемент из data и перемещаем его в хвост buffers.
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
28.08.2020, 20:04  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
При чтении пишем с осцилографа в первый элемент списка buffers, затем удаляем его из buffers и помещаем в хвост списка data
При записи наоборот, сохраняем первый элемент из data и перемещаем его в хвост buffers.
А, то есть я понял правильно, некоего общего буфера со всеми данными мы не формируем?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
28.08.2020, 20:08
Цитата Сообщение от MDmitry Посмотреть сообщение
А, то есть я понял правильно, некоего общего буфера со всеми данными мы не формируем?
Ну, наверное нет. Есть зарезервированная память, buffers, куда можно записывать данные. И память с данными, data, которую нужно записать в файл и перекинуть обратно в зарезервированную.
Тот же самый кольцевой буфер, только более гибкий.
1
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
28.08.2020, 20:10  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ну, наверное нет. Есть зарезервированная память, buffers, куда можно записывать данные. И память с данными, data, которую нужно записать в файл и перекинуть обратно в зарезервированную.
Тот же самый кольцевой буфер, только более гибкий.
Понял, но далеко не так себе представлял кольцевой буфер
Спасибо
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
30.08.2020, 18:30  [ТС]
Подскажите еще один нюанс, если я создам еще один буфер:
C++
1
std::list<DataBuffer> AllData;
а потом в работе с кольцевым буфером буду делать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
while (WaitDataReady())
    {
        DataBuffer &buf = buffers.front();
        AllData.push_back(buffers.front());
 
        for (int i = 0; i < myControlData.nReadDataLen; i++)
        {
            fCH1Data << buf.ScopeDataForChannels[0][i] <<"\n";
            fCH2Data << buf.ScopeDataForChannels[1][i] <<"\n";
            fCH3Data << buf.ScopeDataForChannels[2][i] <<"\n";
            fCH4Data << buf.ScopeDataForChannels[3][i] <<"\n";
 
        }
 
        std::lock_guard<std::mutex> lock(mx);
        buffers.splice(buffers.end(), data, data.begin());
        //buffers.emplace_back();
    }
У меня получится общий буфер с данными? И если да, то я получается могу в другой функции делать возврат:
C++
1
2
DataBuffer &buf = MyScope.AllData.front();
        return buf.ScopeDataForChannels[Номер канала][номер записи];
А кроме команды front, я могу получить доступ к определенному элементу списка AllData по номеру или они не нумеруются?
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
30.08.2020, 19:07
Цитата Сообщение от MDmitry Посмотреть сообщение
Понял, но далеко не так себе представлял кольцевой буфер
Кольцевой буфер - что-то типо этого?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
int i = 0;
int cx = 0;
int bufer[100];
 
while(1)
{
    bufer[i] = cx;
    i++;
    if(i == 100) i = 0;
 
    cx++;
    if(cx == 1000) break;
}
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
30.08.2020, 19:13  [ТС]
Цитата Сообщение от alexu_007 Посмотреть сообщение
Кольцевой буфер - что-то типо этого?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
int i = 0;
int cx = 0;
int bufer[100];
 
while(1)
{
    bufer[i] = cx;
    i++;
    if(i == 100) i = 0;
 
    cx++;
    if(cx == 1000) break;
}
Немного похоже, но к чему этот вопрос?
0
737 / 704 / 110
Регистрация: 29.05.2015
Сообщений: 4,350
30.08.2020, 19:26
Как можно "далеко не так представлять кольцевой буфер"? Само название - пишет в буфер, когда кончается место - начинает писать сначала, затирая уже имеющуюся инфу.
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
30.08.2020, 23:49  [ТС]
Я изначально представлял его как некий массив в который мы пишем по кругу, то есть дошли до последнего элемента, перескочили на первый и продолжаем. В том примере который мне показали, делается немного иначе, цитирую:

Есть зарезервированная память, buffers, куда можно записывать данные. И память с данными, data, которую нужно записать в файл и перекинуть обратно в зарезервированную.
Тот же самый кольцевой буфер, только более гибкий.

Механизм отличается от того что я себе представлял.

Как можно "далеко не так представлять кольцевой буфер"?

Собственно вот так я далеко не так представлял себе кольцевой буфер.

Добавлено через 4 часа 9 минут
oleg-m1973,
я нашел какую-то странность в коде
если сделать вот так в потоке записи:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while (WaitDataReady())
    {
        DataBuffer &buf = buffers.front();
        AllData.push_back(data.front());
 
        for (int i = 0; i < myControlData.nReadDataLen; i++)
        {
            fCH1Data << buf.ScopeDataForChannels[0][i] <<"\n";
            fCH2Data << buf.ScopeDataForChannels[1][i] <<"\n";
            fCH3Data << buf.ScopeDataForChannels[2][i] <<"\n";
            fCH4Data << buf.ScopeDataForChannels[3][i] <<"\n";
 
        }
 
        std::lock_guard<std::mutex> lock(mx);
        
        buffers.splice(buffers.end(), data, data.begin());
        
    }
то данные пишутся иногда с мусором, но на изменение потенциала все реагирует
если сделать вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
while (WaitDataReady())
    {
        DataBuffer &buf = data.front();
        AllData.push_back(data.front());
 
        for (int i = 0; i < myControlData.nReadDataLen; i++)
        {
            fCH1Data << buf.ScopeDataForChannels[0][i] <<"\n";
            fCH2Data << buf.ScopeDataForChannels[1][i] <<"\n";
            fCH3Data << buf.ScopeDataForChannels[2][i] <<"\n";
            fCH4Data << buf.ScopeDataForChannels[3][i] <<"\n";
 
        }
 
        std::lock_guard<std::mutex> lock(mx);
        //data.pop_back();
        buffers.splice(buffers.end(), data, data.begin());
        //buffers.emplace_back();
    }
то не сохраняется никаких измеренных данных, только 128 что соответствует нулю вольт

P.S. Осциллограф уже много раз проверил в обычной консольной программе, там все работает, а тут не пойму что за беда такая
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.08.2020, 23:57
Цитата Сообщение от MDmitry Посмотреть сообщение
я нашел какую-то странность в коде
если сделать вот так в потоке записи:
А в чём отличие? Вроде одинаковый код

Добавлено через 1 минуту
Цитата Сообщение от MDmitry Посмотреть сообщение
то данные пишутся иногда с мусором, но на изменение потенциала все реагирует
Подозреваю, с мусором пишется вот из за этого myControlData.nReadDataLen - там разные значения приходят или всегда одинаковые?
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
30.08.2020, 23:57  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
А в чём отличие? Вроде одинаковый код

Добавлено через 1 минуту

Подозреваю, с мусором пишется вот из за этого myControlData.nReadDataLen - там разные значения приходят или всегда одинаковые?
DataBuffer &buf = data.front();
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.08.2020, 23:58
Цитата Сообщение от MDmitry Посмотреть сообщение
AllData.push_back(data.front());
А это что за хрень?

Добавлено через 38 секунд
Цитата Сообщение от MDmitry Посмотреть сообщение
DataBuffer &buf = data.front();
Должно быть так
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
30.08.2020, 23:59  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Подозреваю, с мусором пишется вот из за этого myControlData.nReadDataLen - там разные значения приходят или всегда одинаковые?
myControlData.nReadDataLen = BUF_4K_LEN;//заводская установка что соответствует 0х1000 или 4096
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
30.08.2020, 23:59
Цитата Сообщение от MDmitry Посмотреть сообщение
то не сохраняется никаких измеренных данных, только 128 что соответствует нулю вольт
Покажи остальной код
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.08.2020, 23:59

Работа с буфером...
Как на VC++ считывать содержание буфера (текст, а не файл)? Как отследить изменение его содержания???

Работа с буфером обмена
Всем привет .. Помогите пожалуйста ... Работаю на QT под Линукс ... Как мне записать информацию в буфер обмена, а потом ее считать ......

Работа с буфером С++ Builder
Задача состоит в следующем: запускаю свою программу на которой есть Memo. Затем открываю различные сайты в браузере, там выделяю какой-либо...

Работа с консольным экранным буфером, C++, C#
Итак собственно вопросы :) 1) Как создать новый консольный экранный буфер? 2) Как сменить текущий активный буфер? ...

Работа с буфером обмена и заголовочные файлы
Здравствуйте. Такая проблема. Установил себе библиотеку qt 5.0.1. Сборка была автоматическая, поэтому установился и qt creator и mingw. До...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
140
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru