Russian Qt Forum
Ноябрь 24, 2024, 06:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Анимация при выполнении запроса  (Прочитано 8991 раз)
Странник
Гость
« : Январь 27, 2011, 10:58 »

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

p.s.
нет, ну интуитивно-то я догадываюсь, что только отдельный поток, но хотелось бы уточнить = )
« Последнее редактирование: Январь 27, 2011, 11:17 от Странник » Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #1 : Январь 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);
}
Записан

Qt 5.11/4.8.7 (X11/Win)
Странник
Гость
« Ответ #2 : Январь 27, 2011, 11:47 »

спасибо, но это несколько не то. повторю, задержка происходит во время выполнения запроса (в приведенном GreatSnake примере - в недрах конструктора QSqlQuery). насколько я понимаю, в это время нет никакой возможности вызвать processEvents() для GUI-потока. верно ли я понимаю?
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #3 : Январь 27, 2011, 11:55 »

Цитировать
...задержка происходит во время выполнения запроса...
Коли так, то увы, поможет только в отдельный поток.
Записан

Qt 5.11/4.8.7 (X11/Win)
White Owl
Гость
« Ответ #4 : Январь 28, 2011, 18:28 »

http://www.prog.org.ru/topic_16315_0.html
Записан
trot
Гость
« Ответ #5 : Январь 29, 2011, 17:39 »

То же бился над этой проблемой. Решение - метод exec() выполняю в отдельном потоке, а в потоке gui анимированный прогресс.
Записан
Странник
Гость
« Ответ #6 : Февраль 01, 2011, 11:13 »

То же бился над этой проблемой. Решение - метод exec() выполняю в отдельном потоке, а в потоке gui анимированный прогресс.
метод exec(), прошу прощения, какого класса? = ) QSqlQuery::exec() должен выполняться в том же потоке, в котором создано подключение, то есть это по сути вынесение всей работы с БД в отдельный поток. в моем случае это, к сожалению, не вариант.
Записан
kirill
Гость
« Ответ #7 : Февраль 02, 2011, 21:10 »

Может имеет смысл оптимизировать sql запрос? Индексов там добавить или разбить на несколько?
Записан
trot
Гость
« Ответ #8 : Февраль 07, 2011, 21:24 »

Не надо переносить всю логику работы с БД в отдельный поток. Досточно выполнить в отдельном потоке только метод QSqlQuery::exec().
Записан
Странник
Гость
« Ответ #9 : Февраль 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

создавать по соединению на запрос - не вариант, значит только полный вынос.
Записан
trot
Гость
« Ответ #10 : Февраль 09, 2011, 22:02 »

Я так сделал и всё работает. Перед выполнением запроса в основном потоке создаю поток, его стартую, далее запускаю анимацию. Дополнительный поток выполняет только запрос, после выполнения запроса испускается сигнал. Основной поток его обрабатывает и останавливает анимацию. Мало того можно даже прервать выполнения длительных запросов, но до этого я пока еще не дошел.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 23.