Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Child от Февраль 09, 2018, 14:29



Название: Помогите разобраться
Отправлено: Child от Февраль 09, 2018, 14:29
Доброго времени суток!!! Мне нужно чтобы на время выполнения запроса отображалось время выполнения этого запроса в секундах.
Делаю так
Код
C++ (Qt)
 QTimer *timer = new QTimer();
 connect(timer, SIGNAL(timeout()), this, SLOT(updateTime()));
 a=0;
 timer->start(1000);
 
void updateTime(){
   a++;
   ui->labelTimer->setText(QString::number(a));
}
 

Если запустить этот код без выполнения запроса, то все отсчитывается ... а если одновременно с выполнением запроса, то ничего не происходит. Может кто подскажет что можно сделать.


Название: Re: Помогите разобраться
Отправлено: Apktyc от Февраль 09, 2018, 15:27
Есть предположение, что в процессе обработки запроса не плохо было бы вызывать QApplication::processEvents() (http://doc.qt.io/qt-5/qcoreapplication.html#processEvents), либо выполнять запрос вне интерфейсного потока.


Название: Re: Помогите разобраться
Отправлено: Child от Февраль 09, 2018, 15:43
qApp -> processEvent() я ставлю после выполнения timer->start(1000); ... но не помогает
Запрос отрабатывает больше минуты и вот сигнал timeout() начинает срабатывать сразу после выполнения запроса


Название: Re: Помогите разобраться
Отправлено: PimenS от Февраль 09, 2018, 16:24
Как вариант, запрос в отдельном потоке.


Название: Re: Помогите разобраться
Отправлено: qate от Февраль 09, 2018, 16:27
запрос (к БД?) выполняется в томже потоке что и таймер - никак не получится одновременно
выноси запросы в отдельный поток


Название: Re: Помогите разобраться
Отправлено: Igors от Февраль 10, 2018, 07:37
запрос (к БД?) выполняется в томже потоке что и таймер - никак не получится одновременно
выноси запросы в отдельный поток
Тогда как отображать истекшее время из "не главной" нитки?


Название: Re: Помогите разобраться
Отправлено: Child от Февраль 10, 2018, 09:26
Да, запрос к БД. Никогда не приходилось работать с потоками. Может кто-нибудь покажет пример как запустить выполнение запроса из другого потока. Это нужно отдельный класс создавать? Или все в одном классе можно сделать?


Название: Re: Помогите разобраться
Отправлено: PimenS от Февраль 10, 2018, 20:15
Простенький пример как использовать отдельный поток. В run() описываешь свой запрос.


Название: Re: Помогите разобраться
Отправлено: Child от Февраль 12, 2018, 08:49
спасибо большое!!! Буду разбираться


Название: Re: Помогите разобраться
Отправлено: qate от Февраль 12, 2018, 09:06
запрос (к БД?) выполняется в томже потоке что и таймер - никак не получится одновременно
выноси запросы в отдельный поток
Тогда как отображать истекшее время из "не главной" нитки?

главная нить запускает и "тикает" время



Название: Re: Помогите разобраться
Отправлено: Child от Февраль 15, 2018, 11:10
PimenS, спасибо большое за пример!!! Все получилось  :)
Только вот есть еще такой вопрос, как обрабатывать ошибки, почему-то если я пытаюсь в потоке выводить сообщение при ошибке выполнения запроса, то вылезают следующие ошибки

QObject::startTimer: timers cannot be started from another thread
QApplication: Object event filter cannot be in a different thread.

Можно ли вообще вызывать сообщения в потоке ???


Название: Re: Помогите разобраться
Отправлено: Child от Февраль 15, 2018, 12:28
пока проблема решилась таким образом ... при ошибке поток высылает сигнал основному приложению с текстом ошибки и это основное приложение выводит ошибку.
Только насколько это правильно ??


Название: Re: Помогите разобраться
Отправлено: PimenS от Февраль 15, 2018, 22:42
пока проблема решилась таким образом ... при ошибке поток высылает сигнал основному приложению с текстом ошибки и это основное приложение выводит ошибку.
Только насколько это правильно ??

Так и должно быть.