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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите разобраться  (Прочитано 7058 раз)
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));
}
 

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

Сообщений: 133


Просмотр профиля
« Ответ #1 : Февраль 09, 2018, 15:27 »

Есть предположение, что в процессе обработки запроса не плохо было бы вызывать QApplication::processEvents(), либо выполнять запрос вне интерфейсного потока.
Записан
Child
Гость
« Ответ #2 : Февраль 09, 2018, 15:43 »

qApp -> processEvent() я ставлю после выполнения timer->start(1000); ... но не помогает
Запрос отрабатывает больше минуты и вот сигнал timeout() начинает срабатывать сразу после выполнения запроса
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #3 : Февраль 09, 2018, 16:24 »

Как вариант, запрос в отдельном потоке.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #4 : Февраль 09, 2018, 16:27 »

запрос (к БД?) выполняется в томже потоке что и таймер - никак не получится одновременно
выноси запросы в отдельный поток
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Февраль 10, 2018, 07:37 »

запрос (к БД?) выполняется в томже потоке что и таймер - никак не получится одновременно
выноси запросы в отдельный поток
Тогда как отображать истекшее время из "не главной" нитки?
Записан
Child
Гость
« Ответ #6 : Февраль 10, 2018, 09:26 »

Да, запрос к БД. Никогда не приходилось работать с потоками. Может кто-нибудь покажет пример как запустить выполнение запроса из другого потока. Это нужно отдельный класс создавать? Или все в одном классе можно сделать?
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #7 : Февраль 10, 2018, 20:15 »

Простенький пример как использовать отдельный поток. В run() описываешь свой запрос.
« Последнее редактирование: Февраль 10, 2018, 20:20 от PimenS » Записан
Child
Гость
« Ответ #8 : Февраль 12, 2018, 08:49 »

спасибо большое!!! Буду разбираться
Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #9 : Февраль 12, 2018, 09:06 »

запрос (к БД?) выполняется в томже потоке что и таймер - никак не получится одновременно
выноси запросы в отдельный поток
Тогда как отображать истекшее время из "не главной" нитки?

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

Записан
Child
Гость
« Ответ #10 : Февраль 15, 2018, 11:10 »

PimenS, спасибо большое за пример!!! Все получилось  Улыбающийся
Только вот есть еще такой вопрос, как обрабатывать ошибки, почему-то если я пытаюсь в потоке выводить сообщение при ошибке выполнения запроса, то вылезают следующие ошибки

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

Можно ли вообще вызывать сообщения в потоке Непонимающий
Записан
Child
Гость
« Ответ #11 : Февраль 15, 2018, 12:28 »

пока проблема решилась таким образом ... при ошибке поток высылает сигнал основному приложению с текстом ошибки и это основное приложение выводит ошибку.
Только насколько это правильно ??
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #12 : Февраль 15, 2018, 22:42 »

пока проблема решилась таким образом ... при ошибке поток высылает сигнал основному приложению с текстом ошибки и это основное приложение выводит ошибку.
Только насколько это правильно ??

Так и должно быть.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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