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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Частое добавление и удаление строки в QAbstractTableModel  (Прочитано 21042 раз)
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« : Февраль 11, 2016, 15:51 »

Добрый день!

Стоит задача сделать таблицу обновлений с помощью QAbstractTableModel.

В небольшом тестовом примере таблица из 4 строк. В нем в отдельном потоке я раз 1 милисекунду добавляю в конец таблицы одну строку с помощью insertRows и одну строку удаляю из ее начала(removeRows). В итоге через 10-60 секунд работы приложение вылетает.
Если добавлять и удалять строки раз в 10 милисекунд, то работает нормально.

Как сделать, чтобы приложение работало стабильно?
Записан
Bepec
Гость
« Ответ #1 : Февраль 11, 2016, 16:30 »

Перестать пороть чушь и сделать нормальную архитектуру приложения.
Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #2 : Февраль 11, 2016, 16:34 »

Можно по конкретнее, что именно исправить

Вылетает с ошибкой:
ASSERT failure in QList<T>::at "index out of range" file qlist.h

This application has requested the Runtime to terminate it in an unusual way
« Последнее редактирование: Февраль 11, 2016, 16:38 от YvenTitan » Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #3 : Февраль 11, 2016, 20:20 »

Можно по конкретнее, что именно исправить

Вылетает с ошибкой:
ASSERT failure in QList<T>::at "index out of range" file qlist.h

This application has requested the Runtime to terminate it in an unusual way

Выход за пределы диапазона. Вы у списка запрашиваете элемент, индекс которого нет.
Записан

Bepec
Гость
« Ответ #4 : Февраль 11, 2016, 20:37 »

Пороть чушь - про добавление и удаление строки с интервалом 1мс.
А так если у вас проблемы в КОДЕ - покажите КОД.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Февраль 11, 2016, 20:48 »

Пороть чушь - про добавление и удаление строки с интервалом 1мс.
А что в этом страшного?

А так если у вас проблемы в КОДЕ - покажите КОД.
Так у ТС проблема в коде или архитектуре?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Февраль 11, 2016, 21:11 »

Можно по конкретнее, что именно исправить
Нельзя так просто работать со списками из разных потоков. Нужно использовать средств синхронизации.
Записан
Bepec
Гость
« Ответ #7 : Февраль 11, 2016, 21:45 »

Таки не заметил прикрепленного архива, извиняюсь.

to Old: да, таки проблема в архитектуре и как следствие реализация в коде.

И я тоже склоняюсь, что виноваты потоки. Низя обращаться к простому списку из двух разных потоков. А если и обращаетесь, то мутексами защищайте чтоли.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Февраль 12, 2016, 07:49 »

Хммм... а что и как засисять? Налепить QMutexLocker во всех методах? Это выглядит уродливо но ничего не гарантирует - могут найтись неперекрытые базовые методы, а то и вообще заклинит
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #9 : Февраль 12, 2016, 08:00 »

могут найтись неперекрытые базовые методы, а то и вообще заклинит
Что значит "могут найтись": небыло-небыло, а потом раз и нашлись? Нужно постараться не забыть перекрыть.
А вообще утверждать работоспособность модели в не gui-потоке я не могу, все никак руки не дойдут попробовать. Я долгие операции выполняю в рабочих нитках, и по сигналу добавляю информацию в модель уже из контексте gui-нитки.
« Последнее редактирование: Февраль 12, 2016, 08:34 от Old » Записан
Bepec
Гость
« Ответ #10 : Февраль 12, 2016, 09:00 »

Не найдется никаких базовых методов. Ибо контейнер добавлен исключительно ТСсом и все методы где он используются описаны опять таки в классе ТСса.

PS да, просто мутекс локеры натыкать и всё становится хорошо.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Февраль 12, 2016, 09:11 »

Ладно, попробуем, ну не с мутексами конечно. В аттаче измененные файлы. Вроде "не летит", но увы - это еще ничего не значит.  

Не найдется...
Свободен
Записан
YvenTitan
Самовар
**
Offline Offline

Сообщений: 174


Просмотр профиля
« Ответ #12 : Февраль 12, 2016, 09:22 »

В реальной задаче добавлять и удалять строку надо чаще, там приходит много обновлений. Это связано с тем, что они приходят с датчиков. Это простой пример, чтобы немного понятно было.

Мьютексы я пробовал делать, но не помогало. Если кто конкретно скажет, куда их поставить, то буду благодарен. В данном тестовом примере поможет qSleep(1) после beginInsertRows и removeInsertRows, но в реальном примере это тоже бессильно.

Мне кажется, что проблема в следующем. При вызове функции beginInsertRows испускается сигнал rowsAboutToBeInserted(), по нему объект QTableView выполняет в потоке вставку строк в себя. При endInsertRows испускается rowsInserted. Аналогично при вызове beginRemoveRows выделяется сигнал rowsAboutToBeRemoved и в потоке QTableView удаляет из View строку. Как синхронизировать эти потоки - для меня главный вопрос. Если где-то неправ - поправьте.
Записан
Bepec
Гость
« Ответ #13 : Февраль 12, 2016, 09:32 »

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

Если поставить QMutexLocker в функции data, insertRows, removeRows, то в данном конкретном проекте вылеты прекращаются.

to Igors: пора бы знать, что если никто не знает об объекте, то и обращаться к нему не могёт, так что "найтись" не могут моменты. Разве что сам напишешь.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Февраль 12, 2016, 09:32 »

В реальной задаче добавлять и удалять строку надо чаще, там приходит много обновлений. Это связано с тем, что они приходят с датчиков. Это простой пример, чтобы немного понятно было.
Не очень понятно, для чего вы всю модель переместили в контекст другой нитки.
Лучше из другой нитки эмитить сигнал, когда появились данные для вставки, а слот из gui-нитки уже будет вставлять их в модель (и выкидывать устаревшие).
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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