13 мая 2020 г. 18:13

QSqlQueryModel & QThread

qt5, qml, QSqlQueryModel

Доброго времени суток. Есть класс модели унаследованный от QSqlQueryModel, обьявление происходит в main.cpp, отображается в qml. Нужно реализовать всю работу модели в отдельном потоке. Кто нибудь сталкивался с таким? или может есть идеи?

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
5

Добрый день.

Может стоит не всю модель выводить в отдельный поток, а лишь часть работы?
Например, длительные вычисления распараллелить через QtConcurrent.
Либо выводить отдельную часть внутри самой модели в QThread.

Какая конкретно у вас задача?

модель отображает вьюшку из базы данных (sqlite), ситуация такая: есть малина (RPi3), при старте приложения идет инициализация wiringРi, и любой запрос через модель в базу(даже самый простой и короткий) тормозит работу wiringРi, вся остальная работа с базой вынесена в отдельные потоки и выполняется без проблем.
п.с. я уже не помню почему но при первом опыте инициализацию wiringРi не удалось вынести в отдельный поток, да и не задумывались над этим. проблема была выявлена уже после модернизации платы, когда были устанволены сетодиоды ативности работы по шине в связке с wiringРi, на момент обработки запроса вся активность в этом направлении останавливается. теперь есть 2 варианта решения проблемы - либо выность модели в отдельные потоки (а их около 10), или работу с библиотекой wiringРi. еще одна особенность при отработке моделей тормозит отрисовка интерфейса на данном устройстве, поскольку при проверке интерфейса на ноуте таких подвисаний нет.

Я правильно понимаю, что по сути тормоза заключаются лишь в запросах к базе данных?
Я не уверен, что модели удастся безболезненно вынести в другой поток.
Возможно, что стоит внутри модели стоит сделать объект класса, который будет держать данные модели, и перенести его в отдельный поток через QThread::moveToThread, соответственно в модели будет объект этого потока.
Read Only доступ можно будет без проблем реализовать через invokable методы, это должно быть потокобезопасно.
А методы записи внутри того объекта защищать мьютексами.
При этом запросы к базе данных можно будет вызывать через сигнал/слотовое соединение, что тоже будет потокобезопасно. Главно поднимать в том объекте какой-нибудь флаг, в стиле - "я занят, ожидайте пока заберу данные" и чтобы этот объект выкидывал сигнал, когда запрос к базе данных закончен и можно обновить вьюшку.

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

Нет, не встречалась. Это просто первое, что мне пришло в голову.

Ведь по сути вся главная проблема модели и вьюшки в том, что GUI должен крутиться в главном потоке и только главном. Иначе обычно программа падает.
А модель в данном случае сильно связана с View, и в QML части устанавливается в качестве аргумента во view. Поэтому берусь предположить, что указатель на объект модели из другого потока будет плохой идеей. То есть даже проверять уже отпадает охота.

Что касается реализации, то один из пользователей реализовывал выборку данных в QThread.
Вот эта статья Qt - Выбор данных из базы данных QSqlQuery в потоке QThread и создание на их основе модели QAbstractTableModel

Если у вас только чтение данных в той модели, то возможно, что это как раз то, что вам нужно, без такой сложной абстракции как я изначально предложил.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Как стать автором?

Внесите вклад в развитие сообщества EVILEG.

Узнайте, как стать автором сайта.

Изучить
Donate

Добрый день, Дорогие Пользователи !!!

Я Евгений Легоцкой, разработчик EVILEG. И это мой хобби-проект, который помогает учиться программированию другим программистам и разработчикам

Если сайт помог вам, и вы хотите также поддержать развитие сайта, то вы можете сделать пожертвование следующими способами

PayPalYandex.Money
Timeweb

Позвольте мне порекомендовать вам отличный хостинг, на котором расположен EVILEG.

В течение многих лет Timeweb доказывает свою стабильность.

Для проектов на Django рекомендую VDS хостинг

Посмотреть Хостинг Timeweb
s
3 июня 2020 г. 2:56
silo1995

C++ - Тест 003. Условия и циклы

  • Результат:35баллов,
  • Очки рейтинга-10
АП
2 июня 2020 г. 22:11
Алексей Пикенин

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
2 июня 2020 г. 14:04
Даниил Чижевский

C++ - Тест 001. Первая программа и типы данных

  • Результат:86баллов,
  • Очки рейтинга6
Последние комментарии
4 июня 2020 г. 12:10
IscanderChe

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Полностью скопировал пример - всё правильно работает. Значит, где-то у меня ошибки в тестовом проекте. Буду разбираться. Извините за беспокойство. :)
4 июня 2020 г. 8:08
Евгений Легоцкой

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Во все колонки установили? Нужно на все колонки устанавливать.
4 июня 2020 г. 7:59
IscanderChe

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Код делегата полностью скопировал в свой тестовый проект, но окрашивается не вся строка целиком, а только ячейка, на которую указывает курсор.
4 июня 2020 г. 7:12
Евгений Легоцкой

Qt/C++ - Урок 091. Как написать кастомный делегат управляющий подсветкой строки в таблице

Добрый день. Удобства ради. В больших проектах удобнее вызывать BaseClass, чем постоянно смотреть, от чего конкретно наследован текущий класс. Экономит время.
Сейчас обсуждают на форуме
МА
f
3 июня 2020 г. 2:49
fryn3

Можно ли сделать в QML таблицу как в Excel?

edi-tableview - нашел пока такое выглядит коряво, посмотрим что можно сделать
2 июня 2020 г. 3:46
Евгений Легоцкой

Медиа файлы Google Firebase

Картинки можете попробовать сжимать через QPixmap, там есть возможность установки scaleFactor, через него можете устанавливать нужные параметры. А что касается конвертации видео, то лучше п…
2 июня 2020 г. 3:01
Евгений Легоцкой

Перехват обращения к локальным файлам QWebEngineView

В вашем случае вполне адекватное решение. Так сказать меньше зло. В противном случае пришлось бы очень много переписывать и перепиливать.
a
1 июня 2020 г. 11:26
alekseyttrv

SSL на Android

у меня стоит версия Qt 5.14.2. В настройках android поставил openssl из коробки, и этот прроект автоматически стянулся. Достаточно было только добавить в .pro-файл строку после этого и все …
О нас
Услуги
© EVILEG 2015-2020
Рекомендует хостинг TIMEWEB