Russian Qt Forum

Qt => Базы данных => Тема начата: Странник от Январь 27, 2011, 10:58



Название: Анимация при выполнении запроса
Отправлено: Странник от Январь 27, 2011, 10:58
доброго времени суток.
есть приложение для вывода данных БД через модель-представление. хотелось бы сделать анимацию (например, busy progress bar) во время выполнения запроса к БД. проблема простая: запросы выполняются в GUI-потоке и интерфейс подвисает.
можно ли выкрутиться, не вынося работу с БД в отдельный поток? думаю копать в сторону QSqlQuery::exec() и драйвера.

p.s.
нет, ну интуитивно-то я догадываюсь, что только отдельный поток, но хотелось бы уточнить = )


Название: Re: Анимация при выполнении запроса
Отправлено: GreatSnake от Январь 27, 2011, 11:33
Цитировать
можно ли выкрутиться, не вынося работу с БД в отдельный поток? думаю копать в сторону QSqlQuery::exec() и драйвера.

Код
C++ (Qt)
QSqlQuery query("SELECT country FROM artist");
while (query.next()) {
        QApplication::processEvents();
        QString country = query.value(0).toString();
        doSomething(country);
}


Название: Re: Анимация при выполнении запроса
Отправлено: Странник от Январь 27, 2011, 11:47
спасибо, но это несколько не то. повторю, задержка происходит во время выполнения запроса (в приведенном GreatSnake примере - в недрах конструктора QSqlQuery). насколько я понимаю, в это время нет никакой возможности вызвать processEvents() для GUI-потока. верно ли я понимаю?


Название: Re: Анимация при выполнении запроса
Отправлено: GreatSnake от Январь 27, 2011, 11:55
Цитировать
...задержка происходит во время выполнения запроса...
Коли так, то увы, поможет только в отдельный поток.


Название: Re: Анимация при выполнении запроса
Отправлено: White Owl от Январь 28, 2011, 18:28
http://www.prog.org.ru/topic_16315_0.html


Название: Re: Анимация при выполнении запроса
Отправлено: trot от Январь 29, 2011, 17:39
То же бился над этой проблемой. Решение - метод exec() выполняю в отдельном потоке, а в потоке gui анимированный прогресс.


Название: Re: Анимация при выполнении запроса
Отправлено: Странник от Февраль 01, 2011, 11:13
То же бился над этой проблемой. Решение - метод exec() выполняю в отдельном потоке, а в потоке gui анимированный прогресс.
метод exec(), прошу прощения, какого класса? = ) QSqlQuery::exec() должен выполняться в том же потоке, в котором создано подключение, то есть это по сути вынесение всей работы с БД в отдельный поток. в моем случае это, к сожалению, не вариант.


Название: Re: Анимация при выполнении запроса
Отправлено: kirill от Февраль 02, 2011, 21:10
Может имеет смысл оптимизировать sql запрос? Индексов там добавить или разбить на несколько?


Название: Re: Анимация при выполнении запроса
Отправлено: trot от Февраль 07, 2011, 21:24
Не надо переносить всю логику работы с БД в отдельный поток. Досточно выполнить в отдельном потоке только метод QSqlQuery::exec().


Название: Re: Анимация при выполнении запроса
Отправлено: Странник от Февраль 09, 2011, 10:30
Цитировать
Threads and the SQL Module
A connection can only be used from within the thread that created it. Moving connections between threads or creating queries from a different thread is not supported.
In addition, the third party libraries used by the QSqlDrivers can impose further restrictions on using the SQL Module in a multithreaded program. Consult the manual of your database client for more information

создавать по соединению на запрос - не вариант, значит только полный вынос.


Название: Re: Анимация при выполнении запроса
Отправлено: trot от Февраль 09, 2011, 22:02
Я так сделал и всё работает. Перед выполнением запроса в основном потоке создаю поток, его стартую, далее запускаю анимацию. Дополнительный поток выполняет только запрос, после выполнения запроса испускается сигнал. Основной поток его обрабатывает и останавливает анимацию. Мало того можно даже прервать выполнения длительных запросов, но до этого я пока еще не дошел.