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

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

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

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

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

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

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

154
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
24.08.2020, 21:58  [ТС]
Студворк — интернет-сервис помощи студентам
Тогда еще вопрос, возможно ли потоку который записывает в файл дать такой приоритет, чтобы Windows выполняла его максимально быстро?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.08.2020, 22:02
Цитата Сообщение от MDmitry Посмотреть сообщение
Тогда еще вопрос, возможно ли потоку который записывает в файл дать такой приоритет, чтобы Windows выполняла его максимально быстро?
Это никак не поможет. Работу с файлами это не ускоряет.

Добавлено через 1 минуту
И, тормозить поток, который начитывает данные с осцилографа тоже нехорошо
1
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
24.08.2020, 22:03  [ТС]
Я понял, спасибо, только вот становится непонятно как работает родная программа осциллографа, она все отрисовывает без проблем
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.08.2020, 22:04
Сделай пока нормальную запись в файл, а не то что ты там делал. Думаю этого будет достаточно.

Добавлено через 40 секунд
Цитата Сообщение от MDmitry Посмотреть сообщение
Я понял, спасибо, только вот становится непонятно как работает родная программа осциллографа, она все отрисовывает без проблем
Там, наверное, всё правильно сделано. Это несложно
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
24.08.2020, 22:07  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Сделай пока нормальную запись в файл, а не то что ты там делал. Думаю этого будет достаточно.

Добавлено через 40 секунд

Там, наверное, всё правильно сделано. Это несложно
Честно сказать, я немного запутался во всех этих list и т.д., но ничего, потихоньку докопаюсь до истины

я записывал массив в файл поэлементно и если правильно понял, записать целиком будет быстрее
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
24.08.2020, 22:09
Цитата Сообщение от MDmitry Посмотреть сообщение
я записывал массив в файл поэлементно и если правильно понял, записать целиком будет быстрее
Да, намного быстрее.
1
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
26.08.2020, 15:32  [ТС]
У меня возникла еще одна проблема, считанный с осциллографа массив является числовым, и если я пытаюсь записать его в файл командой write, он требует преобразования в const char*, при выполнении такого преобразования в файл записываются не значения из массива, а символы соответствующие ascii кодировке. Как этого избежать? я пока вижу только один метод, создать массив из строк, в котором каждый элемент это преобразованное в строку значение int, то-есть было число 128, записали строку "128". Но опять же это будет замедлять работу с кольцевым буфером
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
26.08.2020, 15:41
Цитата Сообщение от MDmitry Посмотреть сообщение
записать его в файл командой write, он требует преобразования в const char*, при выполнении такого преобразования в файл записываются не значения из массива, а символы соответствующие ascii кодировке. Как этого избежать?
Неправильно понимаете что присходит.
Функция write делает бинарную запись. Т.е. в вашем файле оказывается двоичное представление вашего целочисленного массива.
То, что вы видите там какие-то символы, - это вопрос интерпретации этих данных вашим текстовым редактором.

Если вы хотите текстовую запись. Т.е. чтобы при открытии текстовым редактором была читаемая информация - не пользуйтесь функцией write. Пользйтесь записью через << если применяете std::ofstream или через fprintf, если применяете буферизированный вывод в стиле Си.
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
26.08.2020, 15:44  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Неправильно понимаете что присходит.
Функция write делает бинарную запись. Т.е. в вашем файле оказывается двоичное представление вашего целочисленного массива.
То, что вы видите там какие-то символы, - это вопрос интерпретации этих данных вашим текстовым редактором.

Если вы хотите текстовую запись. Т.е. чтобы при открытии текстовым редактором была читаемая информация - не пользуйтесь функцией write. Пользйтесь записью через << если применяете std::ofstream или через fprintf, если применяете буферизированный вывод в стиле Си.
Как было описано в начале этой темы, у меня кольцевой буфер и при поэлементной записи массива, происходит так, что поток записывающий буфер обгоняет поток считывающий данные из буфера и сохраняющий эти данные в файл. Вопрос получается в том, чтобы сохранять удобочитаемые данные на максимальной скорости.

Посоветуйте пожалуйста как максимально быстро писать в файл
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
26.08.2020, 15:51
Цитата Сообщение от MDmitry Посмотреть сообщение
Вопрос получается в том, чтобы сохранять удобочитаемые данные на максимальной скорости.
Ну и? Ваш вариант с предварительным преобразованием в строки заведомо медленнее, чем то, о чем говорил я.

Добавлено через 3 минуты
Цитата Сообщение от MDmitry Посмотреть сообщение
Вопрос получается в том, чтобы сохранять удобочитаемые данные на максимальной скорости.
Причем на самом деле вопрос совсем в другом: как грамотно сделать синхронизацию полученных данных и их записи в файл. Скорость записи в файл не должна влиять на это.

Есть подозрение, что и второй поток для чтения не пришлось бы делать, если бы это самое чтение было правильно организовано.
На какой ОС это все происходит?
Как вы организовали чтение? Если это Windows, то используете ли вы Overlapped IO? Не наставлено ли у вас там, случаем, sleep`ов в коде?
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
26.08.2020, 15:52  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Ну и? Ваш вариант с предварительным преобразованием в строки заведомо медленнее, чем то, о чем говорил я.

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

Причем на самом деле вопрос совсем в другом: как грамотно сделать синхронизацию полученных данных и их записи в файл. Скорость записи в файл не должна влиять на это.

Есть подозрение, что и второй поток для чтения не пришлось бы делать, если бы это самое чтение было правильно организовано.
На какой ОС это все происходит?
Как вы организовали чтение? Если это Windows, то используете ли вы Overlapped IO? Не наставлено ли у вас там, случаем, sleep`ов в коде?
Значит если я буду использовать << то это быстрее? А я могу таким образом отдавать целый массив на запись?
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
26.08.2020, 15:54
Цитата Сообщение от MDmitry Посмотреть сообщение
А я могу таким образом отдавать целый массив на запись?
Через std::copy можно отдать.
Но я повторю: проблема у вас явно не в скорости записи. Т.е. если и правда появилась такая зависимость от скорости записи, то исправлять нужно что-то в Датском королевстве, а не пытаться скорость записи увеличивать.
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
26.08.2020, 15:55  [ТС]
ОС Windows 10, никаких sleep нет, осциллограф возвращает массив считанных значений, но делает это очень быстро
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
26.08.2020, 16:00
Цитата Сообщение от MDmitry Посмотреть сообщение
делает это очень быстро
Значит вам нужно просто минимизировать операции, которые происходят после чтения данных от осциллографа. Не пытаться ускорить запись сразу после чтения, а просто не делать запись вообще. Вместо этого, например, вы можете организовать очередь из таких данных, которая будет пополняться в потоке чтения от осциллографа, а забирать из нее данные будет другой поток, который уже с удобной ему скоростью будет данные на диск записывать.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2020, 16:07
Цитата Сообщение от MDmitry Посмотреть сообщение
Посоветуйте пожалуйста как максимально быстро писать в файл
C++
1
2
3
4
5
std:ofsream out;
..........................
DataBuffer  buf;
...............
out.write((const char *)&buf.ScopeDataForSingleChannel, std::size(buf.ScopeDataForSingleChannel));
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
26.08.2020, 16:07  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Значит вам нужно просто минимизировать операции, которые происходят после чтения данных от осциллографа. Не пытаться ускорить запись сразу после чтения, а просто не делать запись вообще. Вместо этого, например, вы можете организовать очередь из таких данных, которая будет пополняться в потоке чтения от осциллографа, а забирать из нее данные будет другой поток, который уже с удобной ему скоростью будет данные на диск записывать.
Ну собственно это я и пытаюсь делать, но наверное где-то знаний не хватает
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
26.08.2020, 16:09
Цитата Сообщение от MDmitry Посмотреть сообщение
Ну собственно это я и пытаюсь делать, но наверное где-то знаний не хватает
Я тебе как раз это и показывал, практически готовое решение дал
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
26.08.2020, 16:14  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Я тебе как раз это и показывал, практически готовое решение дал
Мне было не все понятно в вашем коде, поэтому я и пытаюсь сам принцип понять
0
19506 / 10109 / 2463
Регистрация: 30.01.2014
Сообщений: 17,833
26.08.2020, 16:19
Цитата Сообщение от MDmitry Посмотреть сообщение
Мне было не все понятно в вашем коде,
Лично я тоже считаю, что тот код полностью иллюстрирует то, о чем я говорил (честно говоря не заметил, что тут уже вторая страница, иначе бы я просто отослал вас к коду oleg-m1973).
Если код не понятен, то надо его разобрать, а по сути решение уже есть.
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 92
26.08.2020, 16:24  [ТС]
По сути, в данный момент, программа читает 4069 записей с осциллографа в первый столбец массива, далее во второй и т.д. до тысячного. Второй поток, так же записывает данные сначала из первого столбца, потом из второго и т.д.

Добавлено через 42 секунды
Цитата Сообщение от DrOffset Посмотреть сообщение
Лично я тоже считаю, что тот код полностью иллюстрирует то, о чем я говорил (честно говоря не заметил, что тут уже вторая страница, иначе бы я просто отослал вас к коду oleg-m1973).
Если код не понятен, то надо его разобрать, а по сути решение уже есть.
Тогда можно позадаю вопросы по тому коду?

Добавлено через 3 минуты
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
struct DataBuffer
{
    DataBuffer()
    {
    }
 
    size_t m_sz = 0;
    int ScopeDataForSingleChannel[4096];
 
};
 
std::mutex mx;
std::condition_variable cv;
std::list<DataBuffer> data;
std::list<DataBuffer> buffers;
 
void ReadData()
{
    for (size_t i = 0; i < 10; ++i)
        buffers.push_back();
 
    for (;;)
    {
        DataBuffer &buf = buffers.front();
        //fill buffer
 
 
        std::lock_guard<std::mutex> lock(mx);
        data.splice(data.end(), buffers, buffers.begin());
        cv.notify_one();
 
        if (buffers.empty())
            buffers.push_back();
    }
}
в структуре DataBuffer, что означает запись
C++
1
2
3
DataBuffer()
    {
    }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.08.2020, 16:24

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Скрипты 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: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru