Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320

Динамический размер кольцевого буфера(ФИФО)

04.05.2018, 14:21. Показов 4863. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте есть программка с шаблоном для работы с кольцевым буфером(ниже приведу весь код).
Я задаю сразу размер буфера:

C++ (Qt)
1
2
3
circular_buffer<uint32_t> *circle;
 
circle = new circular_buffer<uint32_t>(10);
Вопрос : а если я не знаю размерность входных данных,к примеру один рас пришли данные размерностью 10,в другой рас 300,
и причем буфер перезаписывается каждую N - секунду, к примеру каждые 5 секунд буфер перезаписывается но каждый
рас может прийти разный размер как я написал выше, я подумал проста сделать переменную int bufSize и вписывать
место размера как у меня в примере,но тогда я буду тупо забивать буфер,он же не будет переписывать а просто
дописывать в буфер каждые 5 секунд,да и время длительности записи всегда будет по разному задоватся,то есть
количество блоков данных (байт) зависит от настройки времени записи в буфер,как организовать правильно
размерность буфера???

Добавлено через 1 минуту
C++ (Qt)
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
36
37
38
39
40
41
42
43
44
45
46
//-----------------------------------------------------------------------------
/**
    \file cassstringbuff.h
    \brief Хедер главного файла модуля кольцевого буффера(класс)
 
 
    \date 2018
*/
//-----------------------------------------------------------------------------
#ifndef CLASSTRINGBUFF
#define CLASSTRINGBUFF
//-----------------------------------------------------------------------------
#include <stdint.h>
#include <QVector>
#include "csys.h"
//-----------------------------------------------------------------------------
template <class T>
//-----------------------------------------------------------------------------
class circular_buffer
{
public:
    explicit circular_buffer(size_t size) :
        size_(size + 1),
        head_(0),
        tail_(0),
        buf_(size + 1)
{
}
public:
    void put(T item);
    T get();
    void reset(void);
    bool empty(void) const;
    bool full(void) const;
    size_t size(void) const;
 
private:
    size_t size_;
    size_t head_;
    size_t tail_;
    QVector<T> buf_;
    TPARAMRINGBUFFER time;
 
};
//-----------------------------------------------------------------------------
#endif // CLASSTRINGBUFF
C++ (Qt)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
//-----------------------------------------------------------------------------
/**
    \file cassstringbuff.сpp
    \brief Главный файл модуля кольцевого буффера(класс)
 
 
    \date 2018
*/
//-----------------------------------------------------------------------------
#include <cstdio>
#include <QVector>
#include <memory>
#include "classtringbuff.h"
//-----------------------------------------------------------------------------
template <class T>
//-----------------------------------------------------------------------------
void circular_buffer<T>::put(T item)
{
    buf_[head_] = item;
    head_ = (head_ + 1) % size_;
 
    if(head_ == tail_)
    {
        tail_ = (tail_ + 1) % size_;
    }
 
}
//-----------------------------------------------------------------------------
template <class T>
T circular_buffer<T>::get(void)
{
    if(empty())
    {
      return T();
    }
    //Считывания данных и сдвиг индекса чтения (теперь есть свободное место)
    auto val = buf_[tail_];
    tail_ = (tail_ + 1) % size_;
 
    return val;
}
//-----------------------------------------------------------------------------
template <class T>
void circular_buffer<T>::reset(void)
{
    head_ = tail_;
}
//-----------------------------------------------------------------------------
template <class T>
bool circular_buffer<T>::empty(void) const
{
    //Если индекс записи равен индексу чтения буфер пустой
    return head_ == tail_;
}
//-----------------------------------------------------------------------------
template <class T>
bool circular_buffer<T>::full(void) const
{
    //Если индекс чтение больше на 1 то буфер переполнин
    return ((head_ + 1) % size_) == tail_;
}
//-----------------------------------------------------------------------------
template <class T>
size_t circular_buffer<T>::size(void) const
{
    return size_ - 1;
}
//-----------------------------------------------------------------------------
C++ (Qt)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
//-----------------------------------------------------------------------------
/**
    \file ringbuf.h
    \brief Хедер главного файла модуля кольцевого буффера
 
    \author Ромашкан О.А.
 
    \date 2018
*/
//-----------------------------------------------------------------------------
#ifndef RINGBUF_H
#define RINGBUF_H
//-----------------------------------------------------------------------------
#include <QWidget>
#include <stdint.h>
#include <QDebug>
#include <QObject>
#include <QString>
#include "ClassTRingBuff.cpp"
#include "csys.h"
//-----------------------------------------------------------------------------
namespace Ui {
class RingBuf;
}
//-----------------------------------------------------------------------------
class RingBuf : public QWidget
{
    Q_OBJECT
 
public:
    explicit RingBuf(QWidget *parent = 0);
    ~RingBuf();
 
    QString S1;
    QVector<float> S2;
 
    //реальные данные//
    QVector<quint8> data;
 
    circular_buffer<uint32_t> *circle;
 
private slots:
    void on_pushButton_clicked();
 
    void on_lineEdit_4_returnPressed();
 
    void on_pushButton_2_clicked();
 
    void on_pushButton_3_clicked();
 
private:
    Ui::RingBuf *ui;
    TPARAMRINGBUFFER timeRec;
 
signals :
 
public slots :
};
//-----------------------------------------------------------------------------
#endif // RINGBUF_H
C++ (Qt)
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
//-----------------------------------------------------------------------------
/**
    \file ringbuf.cpp
    \brief Главный файл модуля кольцевого буффера
 
    \author Ромашкан О.А.
 
    \date 2018
*/
//-----------------------------------------------------------------------------
#include "ringbuf.h"
#include "ui_ringbuf.h"
#include <QDebug>
#include <QObject>
#include <QString>
#include <stdint.h>
//-----------------------------------------------------------------------------
RingBuf::RingBuf(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::RingBuf)
{
    ui->setupUi(this);
 
    circle = new circular_buffer<uint32_t>(10);
 
}
//-----------------------------------------------------------------------------
RingBuf::~RingBuf()
{
    delete ui;
}
//-----------------------------------------------------------------------------
void RingBuf::on_pushButton_clicked()
{
      S1 = ui->lineEdit_4->text();
      ui->lineEdit_6->setText(S1);
      circle->put(S1.toInt());
      ui->lineEdit_7->setText(S1);
      qDebug()<< S1;
 
      if (circle->full() == true)
      {
          ui->label_5->setText("Буфер переполнен");
      }
      else if (circle->full() == false)
      {
          ui->label_5->setText(" ");
      }
      ui->label_6->setText(" ");
}
//-----------------------------------------------------------------------------
void RingBuf::on_lineEdit_4_returnPressed()
{
      ui->lineEdit_6->clear();
 
      S1 = ui->lineEdit_4->text();
      ui->lineEdit_7->setText(S1);
      circle->put(S1.toInt());
      ui->lineEdit_6->setText(S1);
      qDebug()<< S1;
      if (circle->full() == true)
      {
          ui->label_5->setText("Буфер переполнен");
      }
      else if (circle->full() == false)
      {
          ui->label_5->setText(" ");
      }
      ui->label_6->setText(" ");
}
//-----------------------------------------------------------------------------
void RingBuf::on_pushButton_2_clicked()
{
     // S1.push_back(circle->get());
      ui->lineEdit_5->setText(QString::number(circle->get()));
      qDebug()<< ui->lineEdit_5->text();
 
      if (circle->full()== false)
      {
          ui->label_5->setText(" ");
      }
      if  (circle->empty())
      {
          ui->label_6->setText("Буфер пуст");
      }
      else
      {
          ui->label_6->setText(" ");
      }
 
}
//-----------------------------------------------------------------------------
void RingBuf::on_pushButton_3_clicked()
{
    S2.clear();
    for (int i = 1; i < 11; i ++)
    {
       S2.push_back(i);
 
       circle->put(S2.size());
    }
    qDebug()<< S2;
    if (circle->full() == true)
    {
        ui->label_5->setText("Буфер переполнен");
    }
    else if (circle->full() == false)
    {
        ui->label_5->setText(" ");
    }
        ui->label_6->setText(" ");
}
//-----------------------------------------------------------------------------
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.05.2018, 14:21
Ответы с готовыми решениями:

Очистка кольцевого буфера клавиатуры
Пытался работать с буфером клавиатуры, и совсем не могу его очистить по нажатию клавиши backspace. Пытался делать через приправнивание...

Своя реализация кольцевого буфера не робит...
Вообщем, то ли лыжи не едут, то ли я не обутый... Упражняюсь в программировании, решил налепить кольцевой буфер по известной методе....

Организация кольцевого буфера. Программная реализация монитора
Ребят помогите решить задание по параллельному программированию, завтра уже крайняк сдать надо: Организация кольцевого буфера....

29
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
28.05.2018, 18:30
Студворк — интернет-сервис помощи студентам
Почему тогда просто не накапливать данные в любом подходящем контейнере в течение 10 секунд, а после создать кольцевой буфер нужного размера?
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
28.05.2018, 18:38  [ТС]
Потому что, мне данные приходят в реальном времени и там будет отдельная кнопка по сохранению данных, и с моей стороны я не могу отслеживать действия оператора, по этому надо это так как то сделать

Добавлено через 46 секунд
Там в любой момент может изменится список параметров

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

Добавлено через 1 минуту
Да и так много нюансов от которых мне приходится плесать,
0
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,137
28.05.2018, 19:24
Nightwalker, правильно ли я понимаю вашу задачу?
1) данные приходят в программу из-вне пакетами разного размера,
2) данные должны складироваться пакетами в оперативной памяти,
3) по истечении определённого времени старые пакеты должны теряться,
4) в памяти всегда должны находиться пакеты за последние N секунд,
5) иногда оператор жмёт кнопку и все пакеты из памяти копируются на диски,
6) при сохранения на диски данные в памяти остаются и продолжают обновляться.
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
28.05.2018, 19:41  [ТС]
Ygg, все верно

Добавлено через 6 минут
Оператор даже может нажать во время N записи секунд
0
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,137
28.05.2018, 21:44
Цитата Сообщение от Nightwalker Посмотреть сообщение
все верно
Тогда ещё пара вопросов.
1) Какова регулярность получения новых пакетов?
Можно ли говорить, что пакеты приходят стабильно, X пакетов в минуту.
Или же стабильности нет, пакеты приходят пачками, а потом могут не приходить?
2) Есть ли ограничение на максимальный размер пакета?
3) Каковы, примерно, суммарные объёмы данных за период хранения?
Они измеряются в байтах, килобайтах или мегабайтах?
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
28.05.2018, 22:13  [ТС]
1) Ну почти можно сказать что пакеты приходят стабильно,но не факт но и беда не в этом (реуглярность 25 мс) но опять же не в этом дело (и да могут и не приходить но фокус в длительности записи,как время закончилось буфер на последнем размере и на нем остается
2) ограничения только по времени записи
3) quint8 и неважно слово полу слово,float или int,все в байтах

Добавлено через 2 минуты
мое дело выделить размерность буфера пока идет время записи

Добавлено через 6 минут
упростим задачу,каждые 5 секунда мне приходит пакет,и я допустим установил чтоб размерность буфера росло пока это время не совпадет с значением которым я задал к примеру 25

Добавлено через 1 минуту
то есть как я писал в выше функции, время между пакетами сравневаю с заданым временем

Добавлено через 50 секунд
и если ровно или превышает то делаю pop и push
0
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,137
29.05.2018, 02:32
Nightwalker, если данных не много, частота стабильна и нужны размеры/параметры пакетов, то можно сделать два кольца: одно под характеристики пакетов, второе под сами данные. Размер под данные нужно задавать с запасом. Код может выглядеть как-то так.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
#include <iostream>
#include <chrono>
#include <thread>
#include <mutex>
#include <conio.h>
 
// буфер для записи и копирования
class CMyBuff
{
public:
    // характеристики пакета
    struct SPacket
    {
        int iOffset; // смещение в секции данных
        int iSize; // размер данных
    };
 
protected:
    std::mutex m_mutex; // межпотоковая блокировка
 
    // описание пакетов
    int m_iPacketMaxCount; // максимальное количество пакетов
    int m_iPacketHead; // индекс следующего пакета
    int m_iPacketTail; // индекс последнего пакета
    SPacket* m_pPacket; // пакеты
 
    // данные пакетов
    int m_iDataMaxSize; // максимальный размер данных (должно быть достаточно, что бы вместить все пакеты)
    int m_iDataOffset; // смещение для следующей записи
    int m_iDataSize; // общий размер данных
    char* m_pData; // буфер под данные пакетов
 
public:
    // конструктор
    CMyBuff()
    {
        m_pPacket = 0;
        m_pData = 0;
        Clean();
    }
 
    // деструктор
    ~CMyBuff()
    {
        Clean();
    }
 
    // очистить память
    void Clean()
    {
        m_iPacketMaxCount = m_iPacketHead = m_iPacketTail = 0;
        if (m_pPacket)
        {
            delete[] m_pPacket;
            m_pPacket = 0;
        }
 
        m_iDataMaxSize = m_iDataOffset = m_iDataSize = 0;
        if (m_pData)
        {
            delete[] m_pData;
            m_pData = 0;
        }
    }
 
    // выделить память под пакеты и данные
    bool Init(int iPacketMaxCount, int iDataMaxSize)
    {
        Clean();
 
        if ((iPacketMaxCount <= 1) || (iDataMaxSize <= 0))
            return false; // ошибочные аргументы
 
        m_iPacketMaxCount = iPacketMaxCount;
        m_pPacket = new SPacket[iPacketMaxCount];
 
        m_iDataMaxSize = iDataMaxSize;
        m_pData = new char[iDataMaxSize];
 
        return true;
    }
 
    // добавить пакет (блокируется)
    bool AddPacket(const char* pData, int iSize)
    {
        if (!pData || (iSize <= 0) || !m_pData || !m_pPacket)
            return false;
 
        std::lock_guard<std::mutex> lck(m_mutex);
 
        // суммарный размер пакетов в кольце
        int iDataSize = m_iDataSize;
        if (((m_iPacketHead + 1) % m_iPacketMaxCount) == m_iPacketTail) // есть затирание старого пакета
            iDataSize -= m_pPacket[m_iPacketTail].iSize;
 
        if ((iDataSize + iSize) > m_iDataMaxSize)
            return false; // не влезает, размер задан ошибочно
 
        // новый размер данных
        m_iDataSize = iDataSize + iSize;
 
        // добавляем пакет
        m_pPacket[m_iPacketHead].iOffset = m_iDataOffset;
        m_pPacket[m_iPacketHead].iSize = iSize;
        // индекс следующего пакета
        m_iPacketHead++;
        if (m_iPacketHead == m_iPacketMaxCount)
            m_iPacketHead = 0;
        // индекс последнего пакета
        if (m_iPacketTail == m_iPacketHead)
        {
            m_iPacketTail++;
            if (m_iPacketTail == m_iPacketMaxCount)
                m_iPacketTail = 0;
        }
 
        // копируем данные
        if (m_iDataOffset + iSize <= m_iDataMaxSize)
        {
            // копируем за один раз
            memcpy(m_pData + m_iDataOffset, pData, iSize);
            // новое смещение
            m_iDataOffset += iSize;
            if (m_iDataOffset == m_iDataMaxSize)
                m_iDataOffset = 0;
        }
        else
        {
            // копируем за два раза
            int iSubSize = m_iDataMaxSize - m_iDataOffset;
            memcpy(m_pData + m_iDataOffset, pData, iSubSize);
            memcpy(m_pData, pData + iSubSize, iSize - iSubSize);
            // новое смещение
            m_iDataOffset = iSize - iSubSize;
        }
 
        return true;
    }
 
    // сделать копию (источник блокируется)
    bool Copy(CMyBuff* pSrc)
    {
        if (!pSrc || !pSrc->m_pData || !pSrc->m_pPacket)
            return false;
 
        std::lock_guard<std::mutex> lck(pSrc->m_mutex);
 
        // выделяем память
        if ((m_iPacketMaxCount != pSrc->m_iPacketMaxCount) || (m_iDataMaxSize != pSrc->m_iDataMaxSize))
        {
            if (!Init(pSrc->m_iPacketMaxCount, pSrc->m_iDataMaxSize))
                return false;
        }
 
        // копируем данные
        m_iDataOffset = 0;
        m_iDataSize = pSrc->m_iDataSize;
        int iStartOffset = pSrc->m_iDataOffset - pSrc->m_iDataSize;
        if (iStartOffset < 0)
        {
            memcpy(m_pData, pSrc->m_pData + pSrc->m_iDataMaxSize + iStartOffset, -iStartOffset);
            memcpy(m_pData - iStartOffset, pSrc->m_pData, pSrc->m_iDataSize + iStartOffset);
        }
        else
        {
            memcpy(m_pData, pSrc->m_pData + iStartOffset, pSrc->m_iDataSize);
        }
 
        // копируем пакеты
        m_iPacketHead = m_iPacketTail = 0;
        int iPos = pSrc->m_iPacketTail;
        int iOfs = 0;
        while (iPos != pSrc->m_iPacketHead)
        {
            m_pPacket[m_iPacketHead].iSize = pSrc->m_pPacket[iPos].iSize;
            m_pPacket[m_iPacketHead].iOffset = iOfs;
            iOfs += m_pPacket[m_iPacketHead].iSize;
 
            m_iPacketHead++;
            
            iPos++;
            if (iPos >= pSrc->m_iPacketMaxCount)
                iPos = 0;
        }
 
        return true;
    }
 
    // указатель на данные
    const char* GetDataPtr()
    {
        return m_pData;
    }
 
    // размер данных
    int GetDataSize()
    {
        return m_iDataSize;
    }
    
    // количество пакетов
    int GetPacketsCount()
    {
        int iCount = m_iPacketHead - m_iPacketTail;
        if (iCount < 0)
            iCount += m_iPacketMaxCount;
        return iCount;
    }
 
    // информация о пакете
    const SPacket* GetPacketInfo(int index)
    {
        if ((index < 0) || (index >= GetPacketsCount()))
            return 0;
 
        int iPos = m_iPacketTail + index;
        if (iPos >= m_iPacketMaxCount)
            iPos -= m_iPacketMaxCount;
 
        return &m_pPacket[iPos];
    }
};
 
// тестовый приёмник данных
// 1) генерируем пакеты текста из последовательных чисел от 0 до 10000
// 2) генерируем пакеты текста из случайных чисел от 0 до 10000
void reciver_test_thread(CMyBuff* pBuf, bool* pStopThread)
{
    int iNum = 0;
    char chBuffer[100];
    srand(time(0));
 
    while (!(*pStopThread))
    {
        // ждать 1 мс
        std::this_thread::sleep_for(std::chrono::milliseconds(1));
 
        // формируем пакет из последовательных или случайных чисел
        if (true)
        {
            sprintf(chBuffer, "%d ", iNum);
            // следующее число
            if (++iNum == 10000)
                iNum = 0;
        }
        else
        {
            sprintf(chBuffer, "%d ", rand() % 10000);
        }
 
        // добавить пакет в буфер
        if (!pBuf->AddPacket(chBuffer, strlen(chBuffer)))
        {
            std::cout << "AddPacket() - failed" << std::endl;
            break;
        }
    }
}
 
// тест
int main(int argc, char* argv[])
{
    CMyBuff rec_buf;
    rec_buf.Init(10+1, 1024); // 10 пакетов, содержимое которых должно поместиться в 1024 байтах
 
    // переменная для остановки потока
    bool bStopThread = false;
 
    // запустить тестовый поток
    std::thread test(reciver_test_thread, &rec_buf, &bStopThread);
    
    // ждать 0.5 сек
    std::this_thread::sleep_for(std::chrono::milliseconds(500));
 
    CMyBuff copy_buf;
 
    // пока не нажали кнопку
    while (!kbhit())
    {
        // копировать данные из буфера приёмника во временный буфер
        if (!copy_buf.Copy(&rec_buf))
        {
            std::cout << "Copy() - failed" << std::endl;
            break;
        }
 
        // вывести строку из буфера (скопированные данные лежат одним куском с начала буфера)
        std::cout.write(copy_buf.GetDataPtr(), copy_buf.GetDataSize());
        std::cout << std::endl;
        
        // ждать 1.5 сек
        std::this_thread::sleep_for(std::chrono::milliseconds(1500));
    }
 
    // останавливаем поток
    bStopThread = true;
    if (test.joinable())
        test.join();
 
    std::cout << "finished" << std::endl;
    std::cin.ignore();
    return 0;
}
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
29.05.2018, 11:21  [ТС]
Да данных в этом та и дело что много, и они непрерывно сыпятся,спасибо это тоже решение,но надо сделать именно то что прошу помочь, либо resize буфера,либо класс подправить,помогите используя мой шаблон организовать как то этот нюанс, и я бы с удовольствием бы взял это решение, но уже согласовано на базе того, и дело та в том что не нужно с запасом,нужно ровно впритык так все делать!!!!

Добавлено через 1 минуту
В общем надо сделать нормально формирования размера буфера,мне видится только через resize который я собствено незнаю как написать

Добавлено через 4 минуты
да и данные как данные,это не от меня зависит как они приходят и что с ними у меня есть слот где это приходит и мое дело только с размером буфера разобратся

Добавлено через 22 минуты
nmcf, Я вот подумал почему бы и вправду не хранить в отдельном контейнере и потом создавать буфер размера того контейнера типо

C++ (Qt)
1
2
circle = new circular_buffer<uint32_t>(Get_Data_Package.size());
circle->put(Get_Data_Package.size());
Добавлено через 9 минут
Хотя нет,так тоже не пойдет

Добавлено через 2 минуты
он создает все время буфер ровно того размера сколько данных пришло а надо чтоб увеличивал

Добавлено через 1 час 6 минут
Все всем спасибо разобрался,тема закрыта!!!

Добавлено через 1 час 26 минут
А и маленький вопрос немного не в тему,но чтоб не создавать новую тему так как тоже к буферу относится, в общем мне будет приходить время в миллисекундах к примеру 25 мс, а я время записи задаю в секундах, то есть чтоб правильно щиталось,мне мои задаваемые секунды надо перевести в миллисекунды ,как это сделать ??? на что умножить или поделить надо ??? то есть мне приходит 25 милисекунд а я задал к примеру в Line Edit 30 секунд на что умножить или поделить 30 ??
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
29.05.2018, 17:21
30 * 1000.
0
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 320
29.05.2018, 18:49  [ТС]
Спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.05.2018, 18:49

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

Отображение на экране значений головного и хвостового указателей кольцевого буфера в виде hex строк
Отображение на экране значений головного и хвостового указателей кольцевого буфера в виде шестнадцатиричных строк. Выводить в одни и те же...

размер буфера
принимаю с imap сервера ответ, в массив byte; и ответ добивает пустыми символами массив. свойство Lenght потока выкидывает исключение, ...

WinInet и размер буфера
Начал недавно изучать WinInet (да и С++ в целом конечно). И назрел такой вот вопрос. Что делать в случае, когда размер char буфера меньше...

Передать размер буфера
strcpy_s(Name, sizeof Name, newName); // либо же strcpy_s(Name, Name, newName); Собственно копирую строку, передавая при этом размер...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
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. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru