Russian Qt Forum
Ноябрь 22, 2024, 15:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: QList в качестве буфера  (Прочитано 12686 раз)
Ubuntu_linux
Гость
« : Июнь 26, 2013, 15:27 »

Можно ли использовать QList в качестве буфера для бинарных данных(25-30 айтемов)? или посоветуете альтернативу?
Записан
Bepec
Гость
« Ответ #1 : Июнь 26, 2013, 15:30 »

Можно, никто не запрещает.
Если не нужно лучшее быстродействие, то да.
Если нужно - стандартные STL контейнеры.
Если нужно максимальное - самописные контейнеры. Но это редкость для 25-30 записей.
Записан
Ubuntu_linux
Гость
« Ответ #2 : Июнь 26, 2013, 16:11 »

А что делает метод void QList::append(const T & value) по сути? создает копию или просто хранит указатель?

Если скажем так

Код
C++ (Qt)
QList<MyBuff*> my_list;
MyBuff *item=new MyBuff;
my_list.append(item);

или так

Код
C++ (Qt)
QList<MyBuff> my_list;
MyBuff item;
my_list.append(item);

Какой метод лучше?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Июнь 26, 2013, 16:15 »

Какой метод лучше?
В данном случае (QList) все равно. Даже при использовании второго варианта, QList будет хранить указатели, а не сами объекты.
Записан
Ubuntu_linux
Гость
« Ответ #4 : Июнь 26, 2013, 16:23 »

Хорошо, а если визвать  void QList::removeFirst() то удалится сам объект или указатель?
Записан
Majestio
Гость
« Ответ #5 : Июнь 26, 2013, 16:24 »

Можно ли использовать QList в качестве буфера для бинарных данных(25-30 айтемов)? или посоветуете альтернативу?

Лучшей альтернативой (при такой постановке задачи) - будет обычный массив размерности 30.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Июнь 26, 2013, 16:26 »

Хорошо, а если визвать  void QList::removeFirst() то удалится сам объект или указатель?
В каком случае?
Если в первом варианте, то сам указатель, если во втором, то объект.
Записан
Ubuntu_linux
Гость
« Ответ #7 : Июнь 26, 2013, 16:37 »

Можно ли использовать QList в качестве буфера для бинарных данных(25-30 айтемов)? или посоветуете альтернативу?

Лучшей альтернативой (при такой постановке задачи) - будет обычный массив размерности 30.
Масив не подходит, так как нужно передавать структуру в которой данные и парочку флагов

Код
C++ (Qt)
typedef struct Buffer{
char *data;
int size;
int flag;
}
Записан
Ubuntu_linux
Гость
« Ответ #8 : Июнь 26, 2013, 16:45 »

Хорошо, а если визвать  void QList::removeFirst() то удалится сам объект или указатель?
В каком случае?
Если в первом варианте, то сам указатель, если во втором, то объект.


Дело в том, что у меня при чтении и записи в разных потоках, через некоторое время  вылетает ошибка удаления первого элемента в списке... не пойму в чем подвох...
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Июнь 26, 2013, 16:47 »

Дело в том, что у меня при чтении и записи в разных потоках, через некоторое время  вылетает ошибка удаления первого элемента в списке... не пойму в чем подвох...
А вы правильно работаете с общим QList из разных потоков? Средствами синхронизации пользуетесь?
Записан
Majestio
Гость
« Ответ #10 : Июнь 26, 2013, 16:51 »

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

QList: All functions in this class are reentrant.

Далее читаем: http://qt-project.org/doc/qt-5.0/qtcore/threads-reentrancy.html#reentrant
Записан
Majestio
Гость
« Ответ #11 : Июнь 26, 2013, 16:53 »

Масив не подходит, так как нужно передавать структуру в которой данные и парочку флагов
Массив указателей на структуры. В чем беда?
Записан
Ubuntu_linux
Гость
« Ответ #12 : Июнь 26, 2013, 16:55 »

Блокирую операцию так:

Код
C++ (Qt)
QMutex mutex;
 
void MyThread::run(){
while(1){
mutex.lock();
if(!my_list.isEmpty()){
my_list.removeFirst();
.....
}//if
mutex.unlock();
}//while
}//run
 

Но как я понял операция append() и removeFirst() имеют встроенный мютекс и дополнительно можно не использовать сторонние мютексы или нет?
« Последнее редактирование: Июнь 26, 2013, 17:06 от Ubuntu_linux » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Июнь 26, 2013, 17:00 »

Здесь опечатка? Или вы действительно пытаетесь удалить первый элемент, когда список пуст?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Июнь 26, 2013, 17:01 »

Но как я понял операция append() и removeFirst() имеют встроенный мютекс и дополнительно можно не использовать сторонние мютексы или нет?
Вы не правильно поняли. Свой мютекс нужен.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.117 секунд. Запросов: 23.