Нубский вопрос. Кто нибудь работал с sqlite из не gui

потока. Я просто хочу сделать работу бд в отдельном потоке, чтобы приложение было отзывчивым. Вроде бы все просто.
Смотрел много исходников на гитхабе, видел примеры как в другом потоке делают запрос, потом все данные считывают в массив и по сигналу возвращают этот массив в гуи.
У меня есть сомнения в этом затратном способе.
Но есть и обратная сторона. Когда сделан запрос, sqlquery почти не занимает память. SqlQuery начинает занимает память по мере прохождения по элементам
while (query.next()) { ...}
. Т.е. по сути при итерации идет обращение к бд? Т.к. пытался делать тяжелые запросы и они выполняются моментально. Значит не красиво делать запрос из другого потока, потом возвращать по сингналу QSqlQuery и из гуи пытаться считывать данные.
Почему меня это беспокоит. При андроид программировании на яве, если гуи зависает, то случается anr (application not response, т.е. приложение не отвечает). Гугл рекомендует делать запросы в другом потоке (в room уже кидает исключение если обращение к бд из гуи идет).

Как правильно сделать запросы из другого потока? Можно кусок кода или словесное описание алгоритма пожалуйста

5 ответов

15 просмотров

у меня в последнем проекте все общение с БД в фоне. возвращаю из фонового процесса данные через сигнал в QVariant-e. Затрат нет, поскольку QVariant хранит implicit shared массив.

небольшой недоработаный пример

Это во-первых, мало имеет смысла. Обычно запросы все быстрые, а если они НЕ быстрые, их надо сделать быстрыми. И обычно человек, работающий в GUI c данными, должен сначала получить данные, чтобы потом с ними сделать какое-то следующее дейтсвие. Поэтому вынос общения с БД в отдельный поток практически не имеет смысла. Однако, бывают сложные случаи, когда это делать всё же приходится. Про возможность -- там всё просто, всё так же , как в главном потоке, толькь надо не делать более одного запроса через одно соединение к БД в одно и то же время, и следить за ownership объектов Qt -- некоторые объекты могут "работать" только в том потоке, которому принадлежат, это всё описано в документации. Соотв. тебе надо будет сделать (почти наверняка) очередь запросов и очередь результатов, и сохранять данные (результаты) запросов в БД. Так имеет смысл делать только запросы на выборку, изменяющие данные запросы стоит делать СТРОГО СИНХРОННО, в основном потоке.

Когда сделан запрос, sqlquery почти не занимает память. SqlQuery начинает занимает память по мере прохождения по элементам while (query.next()) { ...} . Т.е. по сути при итерации идет обращение к бд? Т.к.Да, именно так. и при этом важно понимать, что когда ты сделал EXEC , но не выбрал данные , запрос ещё НЕ ВЫПОЛНЕН, данные надо все выбрать, сохранить куда-то, и затем освободить соединение для работы другого запроса.

Ну это называется реактивным программированием (или акторным программированием, не различаю их). То есть ты другому потоку посылаешь сообщение "выполни этот запрос". Другой поток, когда добирается до твоего сообщения, выполняет запрос, формирует ответ и посылает в твой поток сообщение с ответом. Соответственно, твой поток, когда добирается до этого сообщения, делает с ним что нужно. Это можно сделать например через сигналы/слоты - вызов сигнала эквивалентно посыланию сообщения

Похожие вопросы

Обсуждают сегодня

Добрый вечер, Пока не совсем понимаю как наладить общение между телеграм ботом и ПО для работы с сим боксом. По самому боту так понял: - Нужен некий баланс, который можно поп...
Magic
6
сделал сайт, прикрутил в боте сайт, и виджет логина. как автоматически логинить пользователя в аккаунт(телеграм), при входе с бота?
Александра Чернивецкая
5
Объясните, пожалуйста, почему компилятор ругается на использование в условии неинициализированной переменной: int x; Task.Run(async () => { x = await somefunc(); }).Wait...
Александр
5
Ребят, подскажите, пожалуйста, почему в префиксе к ассетам, которые генерируются через фильтр | theme в шаблоне, стал вдруг появляться index.php? Вот так выглядит ссылка на а...
Виталий
1
Всем привет. Ребята, подскажите, пожалуйста. у ботов есть ограничение на отправку сообщений - 30 сообщений в секунду, эти ограничения накладываются на все сообщения? или на со...
Artem Stormageddon
4
Блин, ребята, сори за тупые вопросы. А можно ли как-то открыть вебапку по нажатию на кнопку в меню(которое появляется слева, команды)?
Artem Stormageddon
3
а плаксы из-под питона умеют только в комфортных условиях что-то выдавить из себя?)
Lencore
9
Но, может, есть уже проверенная? Наши требования такие: 1. Сообщения должны приходить из Инста в CRM оду 2. Должна быть возможность подключить несколько экаунтов Инстаграм. Р...
Alexander Sharoiko MSE / Александр Шаройко
13
Это может быть все-таки не флудвейт? у меня ботфазер принимает изменения и отображает даже что они изменились, на видео видно что он прислал якобы уже измененное описание, н...
OVERLINK
13
Коллеги, может знает кто, можно ли цвет бейджа счётчика в BackendMenu менять без бубнов?
Alex Blaze
3
Карта сайта