Опросить QSqlQuery в другом потоке

Можете ли вы опросить QSqlQuery (например, query.value) в потоке, отличном от того, в котором было выполнено соединение/выполнение?


person Pascalau Razvan    schedule 27.09.2017    source источник
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
comment
Я имею в виду использование QSqlQuery после выполнения. Кэширует ли он весь результат? Использует ли он соединение, если я просто просматриваю записи и читаю все значения? - person Pascalau Razvan; 28.09.2017
comment
@ПаскалауРазван. Итак, вы спрашиваете, можно ли передать активный объект QSqlQuery между потоками? Какую проблему вы пытаетесь решить, делая это? Вы надеетесь каким-то образом избежать отправки всех результатов обратно в основной поток? - person ekhumoro; 28.09.2017
comment
@ ekhumoro Я не хочу выполнять синтаксический анализ результата в том же потоке, в котором было создано соединение с БД (я сериализовал доступ, чтобы он происходил в одном потоке вместо нескольких подключений). И да, я хочу знать, могу ли я использовать этот активный QSqlQuery в потоке вызывающего абонента. - person Pascalau Razvan; 28.09.2017
comment
@ПаскалауРазван. Я думаю, что это возможно, но я сам не пробовал. К сожалению, несмотря на долгие поиски, я не смог найти официального заявления Qt о том, поддерживается ли он явно. Просто кажется, что это не то, что делается очень часто. Я видел несколько намеков на то, что повторение результатов в другом потоке должно быть в порядке, но ничего конкретного. Так что, похоже, вам придется найти способ поэкспериментировать с этим самостоятельно. - person ekhumoro; 28.09.2017