Russian Qt Forum
Ноябрь 23, 2024, 03:17
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Model-View (MV)
>
Частое добавление и удаление строки в QAbstractTableModel
Страниц: [
1
]
2
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Частое добавление и удаление строки в QAbstractTableModel (Прочитано 21067 раз)
YvenTitan
Самовар
Offline
Сообщений: 174
Частое добавление и удаление строки в QAbstractTableModel
«
:
Февраль 11, 2016, 15:51 »
Добрый день!
Стоит задача сделать таблицу обновлений с помощью QAbstractTableModel.
В небольшом тестовом примере таблица из 4 строк. В нем в отдельном потоке я раз 1 милисекунду добавляю в конец таблицы одну строку с помощью insertRows и одну строку удаляю из ее начала(removeRows). В итоге через 10-60 секунд работы приложение вылетает.
Если добавлять и удалять строки раз в 10 милисекунд, то работает нормально.
Как сделать, чтобы приложение работало стабильно?
Записан
Bepec
Гость
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #1 :
Февраль 11, 2016, 16:30 »
Перестать пороть чушь и сделать нормальную архитектуру приложения.
Записан
YvenTitan
Самовар
Offline
Сообщений: 174
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #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
Сообщений: 1805
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #3 :
Февраль 11, 2016, 20:20 »
Цитата: YvenTitan от Февраль 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
Выход за пределы диапазона. Вы у списка запрашиваете элемент, индекс которого нет.
Записан
https://github.com/gil9red
https://ru.stackoverflow.com/users/201445/gil9red
Bepec
Гость
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #4 :
Февраль 11, 2016, 20:37 »
Пороть чушь - про добавление и удаление строки с интервалом 1мс.
А так если у вас проблемы в КОДЕ - покажите КОД.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #5 :
Февраль 11, 2016, 20:48 »
Цитата: Bepec от Февраль 11, 2016, 20:37
Пороть чушь - про добавление и удаление строки с интервалом 1мс.
А что в этом страшного?
Цитата: Bepec от Февраль 11, 2016, 20:37
А так если у вас проблемы в КОДЕ - покажите КОД.
Так у ТС проблема в коде или архитектуре?
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #6 :
Февраль 11, 2016, 21:11 »
Цитата: YvenTitan от Февраль 11, 2016, 16:34
Можно по конкретнее, что именно исправить
Нельзя так просто работать со списками из разных потоков. Нужно использовать средств синхронизации.
Записан
Bepec
Гость
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #7 :
Февраль 11, 2016, 21:45 »
Таки не заметил прикрепленного архива, извиняюсь.
to Old: да, таки проблема в архитектуре и как следствие реализация в коде.
И я тоже склоняюсь, что виноваты потоки. Низя обращаться к простому списку из двух разных потоков. А если и обращаетесь, то мутексами защищайте чтоли.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #8 :
Февраль 12, 2016, 07:49 »
Хммм... а что и как засисять? Налепить QMutexLocker во всех методах? Это выглядит уродливо но ничего не гарантирует - могут найтись неперекрытые базовые методы, а то и вообще заклинит
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #9 :
Февраль 12, 2016, 08:00 »
Цитата: Igors от Февраль 12, 2016, 07:49
могут найтись неперекрытые базовые методы, а то и вообще заклинит
Что значит "могут найтись": небыло-небыло, а потом раз и нашлись? Нужно постараться не забыть перекрыть.
А вообще утверждать работоспособность модели в не gui-потоке я не могу, все никак руки не дойдут попробовать. Я долгие операции выполняю в рабочих нитках, и по сигналу добавляю информацию в модель уже из контексте gui-нитки.
«
Последнее редактирование: Февраль 12, 2016, 08:34 от Old
»
Записан
Bepec
Гость
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #10 :
Февраль 12, 2016, 09:00 »
Не найдется никаких базовых методов. Ибо контейнер добавлен исключительно ТСсом и все методы где он используются описаны опять таки в классе ТСса.
PS да, просто мутекс локеры натыкать и всё становится хорошо.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #11 :
Февраль 12, 2016, 09:11 »
Ладно, попробуем, ну не с мутексами конечно. В аттаче измененные файлы. Вроде "не летит", но увы - это еще ничего не значит.
Цитата: Bepec от Февраль 12, 2016, 09:00
Не найдется...
Свободен
Записан
YvenTitan
Самовар
Offline
Сообщений: 174
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #12 :
Февраль 12, 2016, 09:22 »
В реальной задаче добавлять и удалять строку надо чаще, там приходит много обновлений. Это связано с тем, что они приходят с датчиков. Это простой пример, чтобы немного понятно было.
Мьютексы я пробовал делать, но не помогало. Если кто конкретно скажет, куда их поставить, то буду благодарен. В данном тестовом примере поможет qSleep(1) после beginInsertRows и removeInsertRows, но в реальном примере это тоже бессильно.
Мне кажется, что проблема в следующем. При вызове функции beginInsertRows испускается сигнал rowsAboutToBeInserted(), по нему объект QTableView выполняет в потоке вставку строк в себя. При endInsertRows испускается rowsInserted. Аналогично при вызове beginRemoveRows выделяется сигнал rowsAboutToBeRemoved и в потоке QTableView удаляет из View строку. Как синхронизировать эти потоки - для меня главный вопрос. Если где-то неправ - поправьте.
Записан
Bepec
Гость
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #13 :
Февраль 12, 2016, 09:32 »
Система сигнал слотов сама разбирает проблему с потоками, хотя в вашем случае хзкак оно работает
Если поставить QMutexLocker в функции data, insertRows, removeRows, то в данном конкретном проекте вылеты прекращаются.
to Igors: пора бы знать, что если никто не знает об объекте, то и обращаться к нему не могёт, так что "найтись" не могут моменты. Разве что сам напишешь.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Частое добавление и удаление строки в QAbstractTableModel
«
Ответ #14 :
Февраль 12, 2016, 09:32 »
Цитата: YvenTitan от Февраль 12, 2016, 09:22
В реальной задаче добавлять и удалять строку надо чаще, там приходит много обновлений. Это связано с тем, что они приходят с датчиков. Это простой пример, чтобы немного понятно было.
Не очень понятно, для чего вы всю модель переместили в контекст другой нитки.
Лучше из другой нитки эмитить сигнал, когда появились данные для вставки, а слот из gui-нитки уже будет вставлять их в модель (и выкидывать устаревшие).
Записан
Страниц: [
1
]
2
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...