Можете ли вы опросить QSqlQuery (например, query.value) в потоке, отличном от того, в котором было выполнено соединение/выполнение?
Опросить QSqlQuery в другом потоке
comment
Ты это пробовал? Попробуйте и расскажите о своем опыте.
- person eyllanesc   schedule 27.09.2017
comment
Я не пробовал, но хочу. Многопоточный код может занять некоторое время, прежде чем он случайно выйдет из строя, и мне более любопытно, поддерживает ли его архитектура QSqlQuery.
- person Pascalau Razvan   schedule 28.09.2017
Ответы (1)
Согласно документам Qt, это не поддерживается:
Соединение можно использовать только внутри потока, который его создал. Перемещение соединений между потоками или создание запросов из другого потока не поддерживается.
Кроме того, сторонние библиотеки, используемые QSqlDrivers, могут накладывать дополнительные ограничения на использование модуля SQL в многопоточной программе. Обратитесь к руководству вашего клиента базы данных для получения дополнительной информации.
Так что как минимум вы должны добавить новое подключение к базе данных ( с уникальным именем) для каждого потока, из которого вы хотите выполнить запрос.
person
ekhumoro
schedule
27.09.2017
Я имею в виду использование QSqlQuery после выполнения. Кэширует ли он весь результат? Использует ли он соединение, если я просто просматриваю записи и читаю все значения?
- person Pascalau Razvan; 28.09.2017
@ПаскалауРазван. Итак, вы спрашиваете, можно ли передать активный объект
QSqlQuery
между потоками? Какую проблему вы пытаетесь решить, делая это? Вы надеетесь каким-то образом избежать отправки всех результатов обратно в основной поток?
- person ekhumoro; 28.09.2017
@ ekhumoro Я не хочу выполнять синтаксический анализ результата в том же потоке, в котором было создано соединение с БД (я сериализовал доступ, чтобы он происходил в одном потоке вместо нескольких подключений). И да, я хочу знать, могу ли я использовать этот активный QSqlQuery в потоке вызывающего абонента.
- person Pascalau Razvan; 28.09.2017
@ПаскалауРазван. Я думаю, что это возможно, но я сам не пробовал. К сожалению, несмотря на долгие поиски, я не смог найти официального заявления Qt о том, поддерживается ли он явно. Просто кажется, что это не то, что делается очень часто. Я видел несколько намеков на то, что повторение результатов в другом потоке должно быть в порядке, но ничего конкретного. Так что, похоже, вам придется найти способ поэкспериментировать с этим самостоятельно.
- person ekhumoro; 28.09.2017