Название: Анимация при выполнении запроса Отправлено: Странник от Январь 27, 2011, 10:58 доброго времени суток.
есть приложение для вывода данных БД через модель-представление. хотелось бы сделать анимацию (например, busy progress bar) во время выполнения запроса к БД. проблема простая: запросы выполняются в GUI-потоке и интерфейс подвисает. можно ли выкрутиться, не вынося работу с БД в отдельный поток? думаю копать в сторону QSqlQuery::exec() и драйвера. p.s. нет, ну интуитивно-то я догадываюсь, что только отдельный поток, но хотелось бы уточнить = ) Название: Re: Анимация при выполнении запроса Отправлено: GreatSnake от Январь 27, 2011, 11:33 Цитировать можно ли выкрутиться, не вынося работу с БД в отдельный поток? думаю копать в сторону QSqlQuery::exec() и драйвера. Код
Название: 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 Я так сделал и всё работает. Перед выполнением запроса в основном потоке создаю поток, его стартую, далее запускаю анимацию. Дополнительный поток выполняет только запрос, после выполнения запроса испускается сигнал. Основной поток его обрабатывает и останавливает анимацию. Мало того можно даже прервать выполнения длительных запросов, но до этого я пока еще не дошел.
|