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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Загрузка "долгого" кода при старте  (Прочитано 8069 раз)
abr_qt
Гость
« : Август 05, 2011, 01:31 »

Имеется функция, которая довольно долго отрабатывает. Она просто-напросто по сети запрашивает некоторое количество информации, отчего отрабатывает до полуминуты. Функция вызывается при старте программы (во время работы проги функция не вызывается).
Имею такой код:

main.h:
Код:
#include <QApplication>
#include "mainform.h"

int main(int argc, char *argv[])
{
QApplication app(argc, argv);
app.setQuitOnLastWindowClosed(true);

MainForm * mainWindow = new MainForm; //QWidget
mainWindow->show();

app.exec();

return 0;
}

mainform.cpp:
Код:
MainForm::MainForm(QWidget * parent)
: QWidget(parent)
{
...;
preload(); //Вот ета функция
...;
}

Проблема в том, что пока не выполнится данная функция, управление к app.exec() не переходит, потому прога не показывает главное окно ровно столько, сколько работает функция. То есть, до полуминуты.
Как сделать так, чтобы форма показалась сразу при запуске, независимо от того, когда была запущена preload()?

Пробовал через привязку к сигналу (connect, emit), через showEvent - всё то же самое.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Август 05, 2011, 01:44 »

Очевидно, не вызывать функцию в конструкторе формы ну или вызывать асинхронно.
Вопрос в том, что можно делать с вашей программой пока не выполнился preload(). Можно ли и нужно ли пользователю разрешать интерактив? Или надо только показать главное окно?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Август 05, 2011, 01:47 »

Код
C++ (Qt)
QTimer::singleShot(100, this, SLOT(preload()));
только preload() сделать слотом
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Fess
Гость
« Ответ #3 : Август 05, 2011, 05:16 »

Если приложением можно пользоваться без подгрузки этих данных, то делать запрос асинхронным, выносить в другой поток. Если нет - можно просто поставить QSplashScreen и написать в нем loading... Пусть пользователь ждет.
Записан
abr_qt
Гость
« Ответ #4 : Август 05, 2011, 10:37 »

Код
C++ (Qt)
QTimer::singleShot(100, this, SLOT(preload()));
только preload() сделать слотом
Такая мысль была Подмигивающий Просто почему-то метод выглядит костылём. Хотя, если более изящных решений не предложат, воспользуюсь етим Подмигивающий

Очевидно, не вызывать функцию в конструкторе формы ну или вызывать асинхронно.
Вопрос в том, что можно делать с вашей программой пока не выполнился preload(). Можно ли и нужно ли пользователю разрешать интерактив? Или надо только показать главное окно?
В принципе, прога информационная. Она просто отображает данные, которые как раз таки подгружаются. Если  они не загрузятся, то прога просто будет бесфункциональна - будет просто пустое главное окно, но я так и задумал - должно появится окно и, по мере подгрузки данных, в нём будет постепенно отображатся полученная инфа.
Асинхронно - ето как?

Если приложением можно пользоваться без подгрузки этих данных, то делать запрос асинхронным, выносить в другой поток. Если нет - можно просто поставить QSplashScreen и написать в нем loading... Пусть пользователь ждет.
А можно поподробнее про поток? QThread я так понимаю?
« Последнее редактирование: Август 05, 2011, 10:39 от abr_qt » Записан
Странник
Гость
« Ответ #5 : Август 05, 2011, 10:51 »

откуда preload() данные подгружает?
Записан
abr_qt
Гость
« Ответ #6 : Август 05, 2011, 11:20 »

откуда preload() данные подгружает?
По сети с сервака. При помощи mysql
Записан
Странник
Гость
« Ответ #7 : Август 05, 2011, 15:42 »

По сети с сервака. При помощи mysql
то есть из БД, все-таки. как-то много данных грузите, работа в автономном режиме идет, что ли? тогда в отдельном потоке выполняйте запрос,  почитайте про QThread и работу с БД в многопоточном окружении.
Записан
abr_qt
Гость
« Ответ #8 : Август 06, 2011, 08:26 »

По сети с сервака. При помощи mysql
то есть из БД, все-таки. как-то много данных грузите, работа в автономном режиме идет, что ли? тогда в отдельном потоке выполняйте запрос,  почитайте про QThread и работу с БД в многопоточном окружении.
От нескольких килобайт до сотни килобайт в секунду. Нет, режим не автономный.
Хорошо, посмотрю мануалы по потокам. Хотя, мне идея с таймером понравилась Улыбающийся
Записан
Странник
Гость
« Ответ #9 : Август 06, 2011, 09:06 »

От нескольких килобайт до сотни килобайт в секунду. Нет, режим не автономный.
Хорошо, посмотрю мануалы по потокам. Хотя, мне идея с таймером понравилась Улыбающийся
таймер не спасет от заморозки интерфейса.
Записан
abr_qt
Гость
« Ответ #10 : Август 06, 2011, 12:37 »

От нескольких килобайт до сотни килобайт в секунду. Нет, режим не автономный.
Хорошо, посмотрю мануалы по потокам. Хотя, мне идея с таймером понравилась Улыбающийся
таймер не спасет от заморозки интерфейса.
Я в цикле загрузки данных ставлю qApp.processEvents() - не подвисает. Хотя, не спорю, что вариант с QThread даже лучше. А как умнее будет сделать? В main.cpp сконструировать форму и в конструкторе создать поток с функцией preload() или поток создать в самом main.cpp? Не получится ли так, что preload() запустится до того, как в конструкторе главного окна инициализируются все переменные? Етого мне не надо.
Записан
Странник
Гость
« Ответ #11 : Август 06, 2011, 12:49 »

Я в цикле загрузки данных ставлю qApp.processEvents() - не подвисает. Хотя, не спорю, что вариант с QThread даже лучше. А как умнее будет сделать? В main.cpp сконструировать форму и в конструкторе создать поток с функцией preload() или поток создать в самом main.cpp? Не получится ли так, что preload() запустится до того, как в конструкторе главного окна инициализируются все переменные? Етого мне не надо.
от подвисания на долго выполняемых запросах не спасает. но если таких нет, то и так пойдет.
поток запускается вызовом слота start(), ничего не мешает вызвать его после инициализации всех переменных.
Записан
abr_qt
Гость
« Ответ #12 : Август 06, 2011, 14:30 »

от подвисания на долго выполняемых запросах не спасает. но если таких нет, то и так пойдет.
Долго подвешивать может только, скорее всего, query.exec() и/или query.next(), которые перекачивают данные с сервака. В остальном там небольшое тело цикла для обработки полученных данных.

поток запускается вызовом слота start(), ничего не мешает вызвать его после инициализации всех переменных.
Ок, наверное тогда попробую его от главной формы создать и там же запустить. Спасибо Подмигивающий
Записан
asvil
Гость
« Ответ #13 : Август 06, 2011, 14:53 »

В таймере же делать query.exec(".....LIMIT OFFSET");
А вообще умнее будет не показывать столько информации пользователю. Он что же будет шариться по table view со 1000 строк?
Записан
abr_qt
Гость
« Ответ #14 : Август 07, 2011, 14:41 »

В таймере же делать query.exec(".....LIMIT OFFSET");
А вообще умнее будет не показывать столько информации пользователю. Он что же будет шариться по table view со 1000 строк?
Там не table view, там посекундная сетевая статистика. Я не могу ставить ни LIMIT, ни OFFSET - статистика нужна вся.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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