Цикличен буфер с четци

Имам нужда от имплементация на цикличен буфер, която поддържа четци с възможност за търсене. Моят случай на употреба:

В моя код събирам регистрационни съобщения. В крайна сметка потребителят може да посети страница, която ги показва добре форматирани. За да съм сигурен, че съобщенията не запълват RAM, имам нужда от FIFO структура с фиксиран размер. Ако потребителят не посещава страницата дълго време, съобщенията изчезват. Това е добре.

Докато потребителят остава на страницата, към страницата трябва да се добавят нови регистрационни съобщения. Чрез JavaScript потребителят може да определи колко съобщения да запази. Това е напълно независимо от размера на буфера в моето приложение. Така че имам нужда от четец на структурата на данните, който мога да използвам, за да итерирам всички нови елементи.

Ако потребителят презареди страницата или я зареди за първи път, трябва да настроя четеца на най-стария елемент във FIFO.

Тъй като съобщенията се добавят, четецът трябва да се актуализира. Ако браузърът не успее да извлече новите съобщения достатъчно бързо, четецът в крайна сметка трябва да посочи най-старото съобщение във FIFO. Това означава, че потребителят може да пропусне няколко съобщения. Това не е перфектно, но би трябвало да е необичаен случай. Ако читателят можеше да ми каже „пропуснах 5 съобщения“, това би било идеално, но мога да живея и без това.

Знаете ли съществуваща реализация, която предлага това?


person Aaron Digulla    schedule 26.05.2011    source източник


Отговори (1)


Опитайте http://commons.apache.org/collections/, вижте кръговите буфери там.

person Karl-Bjørnar Øie    schedule 26.05.2011
comment
Безполезно в моя случай. Всички тези реализации предлагат само разрушителни четения (чрез remove()) или гетери, които биха принудили кода на четеца да знае кои съобщения вече са обработени. - person Aaron Digulla; 26.05.2011
comment
можете да четете с помощта на итератора: commons.apache.org/collections/api-release/org/apache/commons/ - person Pih; 26.05.2011
comment
Итераторът не се актуализира, когато елементите се добавят към буфера. - person Aaron Digulla; 26.05.2011
comment

Можете да опитате друг начин за създаване на нишки за четене на плочките.

Създайте myReaderObject като подклас от QObject.

Във вашия конструктор на основната нишка създайте член QThread обект:

m_workerthread=new QThread();
m_workerthread->start();

За четене на плочка направете

myReaderObject *reader=new myReaderObject();
reader->moveToThread(m_workerthread);
connect ( reader, SIGNAL(myFinishSignal() , ...
QMetaObject::invokeMethod(reader,"read", Qt::AutoConnection);

Тогава вашият myReaderObject разбира се се нуждае от метод за четене и сигнал myFinishSignal

- person Aaron Digulla; 26.05.2011