Russian Qt Forum

Qt => Общие вопросы => Тема начата: Ubuntu_linux от Июнь 26, 2013, 15:27



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


Название: Re: QList в качестве буфера
Отправлено: Bepec от Июнь 26, 2013, 15:30
Можно, никто не запрещает.
Если не нужно лучшее быстродействие, то да.
Если нужно - стандартные STL контейнеры.
Если нужно максимальное - самописные контейнеры. Но это редкость для 25-30 записей.


Название: Re: QList в качестве буфера
Отправлено: Ubuntu_linux от Июнь 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);

Какой метод лучше?


Название: Re: QList в качестве буфера
Отправлено: Old от Июнь 26, 2013, 16:15
Какой метод лучше?
В данном случае (QList) все равно. Даже при использовании второго варианта, QList будет хранить указатели, а не сами объекты.


Название: Re: QList в качестве буфера
Отправлено: Ubuntu_linux от Июнь 26, 2013, 16:23
Хорошо, а если визвать  void QList::removeFirst() то удалится сам объект или указатель?


Название: Re: QList в качестве буфера
Отправлено: Majestio от Июнь 26, 2013, 16:24
Можно ли использовать QList в качестве буфера для бинарных данных(25-30 айтемов)? или посоветуете альтернативу?

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


Название: Re: QList в качестве буфера
Отправлено: Old от Июнь 26, 2013, 16:26
Хорошо, а если визвать  void QList::removeFirst() то удалится сам объект или указатель?
В каком случае?
Если в первом варианте, то сам указатель, если во втором, то объект.


Название: Re: QList в качестве буфера
Отправлено: Ubuntu_linux от Июнь 26, 2013, 16:37
Можно ли использовать QList в качестве буфера для бинарных данных(25-30 айтемов)? или посоветуете альтернативу?

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

Код
C++ (Qt)
typedef struct Buffer{
char *data;
int size;
int flag;
}


Название: Re: QList в качестве буфера
Отправлено: Ubuntu_linux от Июнь 26, 2013, 16:45
Хорошо, а если визвать  void QList::removeFirst() то удалится сам объект или указатель?
В каком случае?
Если в первом варианте, то сам указатель, если во втором, то объект.


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


Название: Re: QList в качестве буфера
Отправлено: Old от Июнь 26, 2013, 16:47
Дело в том, что у меня при чтении и записи в разных потоках, через некоторое время  вылетает ошибка удаления первого элемента в списке... не пойму в чем подвох...
А вы правильно работаете с общим QList из разных потоков? Средствами синхронизации пользуетесь?


Название: Re: QList в качестве буфера
Отправлено: Majestio от Июнь 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


Название: Re: QList в качестве буфера
Отправлено: Majestio от Июнь 26, 2013, 16:53
Масив не подходит, так как нужно передавать структуру в которой данные и парочку флагов
Массив указателей на структуры. В чем беда?


Название: Re: QList в качестве буфера
Отправлено: Ubuntu_linux от Июнь 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() имеют встроенный мютекс и дополнительно можно не использовать сторонние мютексы или нет?


Название: Re: QList в качестве буфера
Отправлено: Old от Июнь 26, 2013, 17:00
Здесь опечатка? Или вы действительно пытаетесь удалить первый элемент, когда список пуст?


Название: Re: QList в качестве буфера
Отправлено: Old от Июнь 26, 2013, 17:01
Но как я понял операция append() и removeFirst() имеют встроенный мютекс и дополнительно можно не использовать сторонние мютексы или нет?
Вы не правильно поняли. Свой мютекс нужен.


Название: Re: QList в качестве буфера
Отправлено: Ubuntu_linux от Июнь 26, 2013, 17:05
Здесь опечатка? Или вы действительно пытаетесь удалить первый элемент, когда список пуст?


Где пропал ! , я же ставил....


Название: Re: QList в качестве буфера
Отправлено: Igors от Июнь 26, 2013, 17:21
Но как я понял операция append() и removeFirst() имеют встроенный мютекс и дополнительно можно не использовать сторонние мютексы или нет?
Мне неизвестен ни один контейнер ни в std:: ни в Qt который имел бы встроенный мутекс. Все эти контейнеры "потоко-опасны" и засисяться нужно самому.

Можно ли использовать QList в качестве буфера для бинарных данных(25-30 айтемов)? или посоветуете альтернативу?
На таком порядке данных (25-30) достоинства контейнера особого значения не имеют. А если сам айтем хоть сколько-то приличный (32 байтв и более) то вообще QList - хороший, а может и лучший выбор


Название: Re: QList в качестве буфера
Отправлено: Old от Июнь 26, 2013, 17:22
Где пропал ! , я же ставил....
Попробуйте использовать вместо ручного управления мютексами (lock/unlock) - QMutexLocker.
IMHO, где-то у вас с синхронизацией проблема.


Название: Re: QList в качестве буфера
Отправлено: Old от Июнь 26, 2013, 17:23
Мне неизвестен ни один контейнер ни в std:: ни в Qt который имел бы встроенный мутекс.
Это потому, что они не могут существовать. :)


Название: Re: QList в качестве буфера
Отправлено: Ubuntu_linux от Июнь 26, 2013, 23:48
Ну вродебы весь геморрой из за указателей при большой скорости обмена в вдох потоках.


Название: Re: QList в качестве буфера
Отправлено: Bepec от Июнь 27, 2013, 06:47
Маленькая поправка - для программы не существует "большой скорости обмена". Если у неё нормальная архитектура, тогда будет работать. Если ненормальная - печаль и проблемы :P

PS используйте мутексы и не парьтесь.


Название: Re: QList в качестве буфера
Отправлено: Igors от Июнь 27, 2013, 07:01
Маленькая поправка - для программы не существует "большой скорости обмена".
Еще как существует

Ну вродебы весь геморрой из за указателей при большой скорости обмена в вдох потоках.
Это легко проверить - напр на OSX утилита покажет overhead на диаграмме процессоров. На др платформах тоже должны быть такие средства. Но причиной может быть неправильная синхронизация или ее отсутствие (у Вас я пока не вижу как нитку будите).


Название: Re: QList в качестве буфера
Отправлено: Old от Июнь 27, 2013, 07:21
Ну вродебы весь геморрой из за указателей при большой скорости обмена в вдох потоках.
Показывайте ваши потоки без основной работы, но с синхронизацией.


Название: Re: QList в качестве буфера
Отправлено: serg_hd от Июнь 28, 2013, 13:32
Какой метод лучше?
В данном случае (QList) все равно. Даже при использовании второго варианта, QList будет хранить указатели, а не сами объекты.

а может всё-таки копии объектов?


Название: Re: QList в качестве буфера
Отправлено: Old от Июнь 28, 2013, 13:47
а может всё-таки копии объектов?
Хорошо. Указатели на копии объектов. :-)
Но здесь ключевой момент - указатели.