Задержка qt

Как дать задержку в выполнении цикла с помощью Qt

Задержка qt

В моем приложении я хочу, чтобы при выполнении цикла каждый раз, когда управление передается в цикл, каждое выполнение должно быть отложено на определенное время. Как я могу это сделать?

qt loops ИсточникCuriousCase     30 сентября 2010 в 14:16

Правка (удалено неверное решение).EDIT (чтобы добавить этот другой параметр):

Другим способом его использования был бы подкласс QThread, так как он защищал методы *sleep.

QThread::usleep(unsigned long microseconds);QThread::msleep(unsigned long milliseconds);QThread::sleep(unsigned long second);

Вот код для создания собственного метода *sleep.

#include class Sleeper : public QThread{public: static void usleep(unsigned long usecs){QThread::usleep(usecs);} static void msleep(unsigned long msecs){QThread::msleep(msecs);} static void sleep(unsigned long secs){QThread::sleep(secs);}};

и вы называете это тем, что делаете это:

Sleeper::usleep(10);Sleeper::msleep(10);Sleeper::sleep(10);

Это даст вам задержку в 10 микросекунд, 10 миллисекунд или 10 секунд, соответственно. Если таймеры базовой операционной системы поддерживают разрешение.

Live     30 сентября 2010 в 14:19

Как обновление ответа @Live's, для Qt ≥ 5.2 больше нет необходимости в подклассе QThread , так как теперь функции сна являются общедоступными:

  • QThread * currentThread()
  • Qt::HANDLE currentThreadId()
  • int idealThreadCount()
  • void msleep(unsigned long msecs)
  • void sleep(unsigned long secs)
  • void usleep(unsigned long usecs)
  • void yieldCurrentThread()

БФ http://qt-project.org/doc/qt-5/qthread.html#static-public-members

zmo     19 апреля 2014 в 11:44

C++11 имеет некоторые портативные вещи таймера. Проверить sleep_for.

Coder     07 октября 2012 в 14:40

Как дать временную задержку для вызова функции в Angular 5?

Я хочу дать ему некоторую задержку перед вызовом redirect URL, чтобы позволить хранить необходимые данные. Как этого можно достичь?

Как добавить задержку внутри цикла for с помощью таймеров

По следующему коду (интервал timer2 равен 1000) private void timer1_Tick(object sender, EventArgs e) { timer7.Enabled=false; timer8.Enabled=false; lblTimer_Value_InBuildings.Text=0; } private void…

Как дать окончательное приложение QT к моему клиенту

Я новичок в Qt. Я создал приложение Qt в netbeans на OS X теперь я хочу передать его клиенту, но когда я открываю exe, он также открывает terminal с ним. Как я могу дать его пользователю, чтобы он…

Установите задержку в выполнении цикла в JavaScript

Мне нужно установить задержку в выполнении цикла for в JavaScript. Вот мой код: function myFunction1() { var list = document.getElementById('SomeList'); var items = list.getElementsByTagName('li');…

Расчесывание внешнего цикла событий с помощью Qt

Я создаю клиент Qt для игры с открытым исходным кодом клиент/сервер 4X strategy game Thousand Parsec . Это проект Google Summer of Code. Однако я застрял в тупике. В основном клиент взаимодействует…

создать задержку в swift 3 внутри цикла

Я знаю, что могу задержать часть кода в Swift 3, Используя следующий синтаксис ( как запрограммировать задержку в Swift 3 ): let when = DispatchTime.now() + 2 // change 2 to desired second delay….

Как я могу сделать задержку внутри моего “цикла for”?

Как я могу написать код, чтобы сделать задержку в конце моего “for loop”, чтобы сделать, например, 1 миллисекундную задержку перед прохождением следующего цикла?

добавить задержку в javascript для цикла

Мне нужно добавить задержку внутри цикла в этот код javascript, но я не могу понять, как это сделать : var hossam = document.getElementsByClassName('_42ft _4jy0 _4jy3 _517h _51sy'); for (var i = 0;…

Как контролировать задержку репликации Cassandra?

У меня есть настройка кластера Cassandra с центром обработки данных, каждый центр обработки данных имеет 3nodes. При выполнении нагрузочного тестирования на нем данные реплицируются из datacenter1 в…

Я не могу создать ступенчатую задержку перехода в Javascript с помощью цикла

Я пытаюсь создать ступенчатую задержку перехода для коллекции HTML в JavaScript и не могу сделать это с помощью цикла for. Коллекция HTML хранится в переменной с именем listItem. Это код, который я…

Источник: https://coderoad.ru/3831439/%D0%9A%D0%B0%D0%BA-%D0%B4%D0%B0%D1%82%D1%8C-%D0%B7%D0%B0%D0%B4%D0%B5%D1%80%D0%B6%D0%BA%D1%83-%D0%B2-%D0%B2%D1%8B%D0%BF%D0%BE%D0%BB%D0%BD%D0%B5%D0%BD%D0%B8%D0%B8-%D1%86%D0%B8%D0%BA%D0%BB%D0%B0-%D1%81-%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E-Qt

Задержка qt

Задержка qt

› Варикоз

28.01.2020

Пожалуйста, обратитесь к следующей ссылке, поскольку я попытался упростить возникшую у меня проблему и теперь столкнулся с проблемой, которую я не могу решить.

В проводке для ссылки выше я упростил задачу, которую я пытаюсь сделать, просто сказав, что хочу нажать кнопку и показать ей что-то в QTextBrowser каждые 10 секунд. Мне было трудно получить QTimer , работая в то время, поэтому я подумал, что если бы я смог получить QTimer для работы, я мог бы закончить свою задачу.

То, что я действительно пытаюсь сделать, это прочитать строки из файла, и после каждых 2500 строк я хотел бы напечатать сообщение, а затем подождать 10 секунд.

QTimer хорош, но он делает противоположное тому, что я хочу, чтобы он делал. Вместо передачи сообщения и ожидания 10 секунд сначала они ждут 10 секунд, тайм-аут и затем отправляют сообщение.

Итак, чтобы заставить его работать так, как я хочу, я сначала назвал printMessage() SLOT, а затем сделал SLOT под названием stopTimer() , который просто останавливает таймер. Таким образом, через 10 секунд он просто вызовет stopTimer(), а затем продолжит обработку входного файла.

К РЕАЛЬНОЙ проблеме:

Qt не ждет завершения QTimer , прежде чем он перейдет через код. Я хочу, чтобы код дождался полных 10 секунд, прежде чем он прочитает следующие 2500 строк кода. Я обнаружил, что QTimer имеет функцию isActive() , которая возвращает значение bool.

Итак, в том месте, где я хотел завершить 10-секундную задержку, я поставил следующее:

Я решил, что программа останется в этом цикле на 10 секунд, а затем выйдет после истечения времени QTimer , потому что условие будет ложным. Проблема в том, что он не выходит из цикла, потому что состояние таймера никогда не изменяется независимо от того, сколько времени он ждет в этом цикле! Я проверил с отладчиком, и isActive( ) остается истинным независимо от прошедшего времени.

Затем я опустил цикл while(timer->isActive()) и наблюдал таймер в отладчике. Кажется, что таймер фактически не запускает синхронизацию до тех пор, пока не выйдет из него (не в конце файла).

Поэтому я считаю, что, поскольку цикл while(timer->isActive()) вложен внутри этого, он заставляет его никогда не таймаутом. Я мог ошибаться, но похоже, что это происходит.

Кроме того, что раздражает то, что объект QTimer не имеет поля, которое показывает прошедшее время таймера, когда оно активно. Поэтому я больше не могу проверить прошедшее время для дальнейшего отладки.

Кто-нибудь, пожалуйста, проверьте это или дайте мне знать обходное решение для этого!

Для чего-то, что звучит так просто, это была самая большая боль, которая у меня была в последнее время, но я вообще не использую Qt, так что это может быть мой недостаток опыта.

Вот выдержка из кода, который у меня есть, который в настоящее время зависает, как указано выше:

Извините за длинный пост, и если бы я мог сделать какие-либо грамматические ошибки с моим кодом здесь. У меня нет доступа к Интернету на моей машине dev, поэтому мне пришлось повторить это здесь.

Я выяснил решение, которое намного проще, чем предлагаемые здесь.

Я понял, что гораздо проще использовать объект QTime вместо объекта QTimer.

В основном вы запускаете объект QTime, а затем используете функцию elapsed(), чтобы проверить, сколько времени прошло с момента его запуска.

Спасибо всем, что нашли время, чтобы помочь. Я попытался реализовать пару своих решений в моем коде, но имел некоторые проблемы, так как я не профессионал в Qt, и они были более сложными, чем я мог бы подумать. В конце концов я нахожу это решение легким решением того, что должно было быть легкой проблемой.

Читать еще:  Классификация гематом

Я определенно многому научился из этой проблемы, и я надеюсь, что вы тоже все сделали.

Мой вопрос к вам: почему никто не предлагал использовать QTime с самого начала?

Еще раз спасибо!

Выполнение чего-то вроде while(timer.isActive()) не является хорошей идеей, так как это приведет к тому, что ваше приложение будет потреблять около 100% процессорного времени. Это также приведет к тому, что ваше приложение никогда не вернется в цикл обработки событий, где выполняется фактический код для таймера, поэтому он зависает.

Если вы все еще хотите использовать этот подход, вы должны вызывать QCoreApplication:: processEvents() в цикле. Он временно передаст управление обратно в цикл событий, так что таймер выйдет из таймера.

Вместо того, чтобы подключать timeout() к stopTimer(), вы можете просто вызвать timer.setSingleShot(true), прежде чем запускать его, это приведет к его остановке автоматически после первого таймаута.

Обратите внимание, что там есть утечка памяти при создании нового таймера при каждом нажатии кнопки. Несомненно, они являются детьми вашей формы и будут уничтожены, но только тогда, когда форма будет уничтожена.

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

Этот класс также должен иметь своего рода readMore() слот, который будет читать 2500 строк, а затем поставить сообщение и вернуться.

Если он не достигнет конца потока, тогда он вызовет QTimer:: singleShot (10000, это, SLOT (readMore())), что вызовет цикл вызова для повторного вызова readMore() за 10 секунд. Код будет выглядеть примерно так (не проверял на наличие ошибок):

Это своего рода более тяжелый подход, но это цена обработки асинхронных событий. Вы также можете поместить все это в класс Form, но я думаю, что лучше использовать отдельный класс.

Как указывает Даниэль, если чтение 2500 строк занимает много времени, скажем, 5 секунд, сообщение будет напечатано через 10 секунд после окончания чтения, то есть через 15 секунд после его начала.

Если вы хотите, чтобы сообщение печаталось приблизительно каждые 10 секунд независимо от того, сколько времени занимает чтение, вы должны добавить в класс поле QTimer timer , подключить его к сигналу timeout() в слот readMore() в конструкторе MyFileReader, затем в метод startReading() вызывает timer.start() перед вызовом readMore(). Теперь, в конце readMore() сделайте следующее:

В этом случае вам нужно поле QTimer, потому что вы не можете отменить вызов QTimer:: singleShot(), но вам нужно сделать это, если вы достигли конца потока, иначе ваш readMore() будет просто продолжать когда вы звоните снова и снова, даже если читать больше нечего.

Обратите внимание, что даже в этом случае сообщение может появляться менее часто, чем каждые 10 секунд, если чтение 2500 строк занимает больше времени, чем эти 10 секунд.

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

Немного от темы, но если вам нужен простой способ избежать утечек памяти, вы также можете сделать это в конструкторе:

Он автоматически пометит ваш читатель для удаления, когда вы emit finished() , и, как только это произойдет, считыватель будет удален, как только элемент управления вернется в цикл событий. То есть после того, как все слоты подключены к завершенному сигналу(). Этот подход позволяет вам просто выделить MyFileReader в куче, а затем отбросить указатель, не беспокоясь о утечке памяти.

а подробнее ситуацию? просто ето же можно организовать сообщением, которое пользователь почитает и закроет. и никакой паузы не надо — обычный QMessageBox.

Читать еще:  Из за чего кровоточат десна

хотя удобный вариант слипа тоже интересен. просто для расширения кругозора

Виджет в котором ввелись некорректные данные просто помигает
типа что-то такого

template static void Migalo(T * sender) QPalette new_pal = sender->palette();

QPalette old_pal = sender->palette();

new_pal.setColor(QPalette::Active, QPalette::Base, Qt::red); for(int i = 0; i setPalette(new_pal);

// ::sleep(80);

а бесконечные месаги, не всегда полезны, хотя и без них никуда.Просто в тех местах где необходимо я просто мигаю

например в вводе password никто не будет проверять корректность вводимых данных Валидатором

Программист-романтик

Профиль Группа: Комодератор Сообщений: 3645 Регистрация: 21.5.2005

Где: Воронеж

Репутация: 16
Всего: 92

Опытный

Профиль Группа: Участник Сообщений: 462

Источник: https://krupnoopt.ru/varikoz/zaderzhka-qt.html

QTimer. Создание таймера и обработка его событий с примером программы

Задержка qt

Здравствуйте.

При написании многих программ часто возникает необходимость следить за временем и периодично выполнять какие-нибудь действия. Для этого используют таймеры. При использовании кроссплатформенного фреймворка Qt используют QTimer.

В этой заметке я расскажу о классе QTimer, о создании таймера и об обработке его событий, о статическом методе singleShot() класса QTimer.

 На примере покажу, как создать программу, которая показывает текущее время в течение 5-ти секунд, а после закрывается. Таймер в ней нужен для обновления текущего времени на экране каждую секунду.

Метод singleShot() понадобится для закрытия программы через 5 секунд.

Класс унаследован от QObject, а значит умеет работать с сигналами и слотами. Предоставляет регулярные таймеры, которые по истечении заданного промежутка времени посылают сигнал timeout().

При этом класс имеет статический метод singleShot(), он посылает сигнал через заданный промежуток времени лишь один раз. События таймера будут доставлять только тогда, когда работает цикл обработки событий.

Для использования нужно подключить #include

Включает в себя public-функции:

  • int interval() — возвращает числовое(int) значение установленного интервала таймера в миллисекундах
  • int remainingTime() — возвращает оставшееся время в миллисекундах
  • bool isActive() — возвращает логическое(bool) значение true, если таймер запущен
  • bool isSingleShot() — возвращает true, если таймер включен для срабатывания только один раз
  • void setInterval(int msec) — возволяет установить интервал таймера, где msec — время в миллисекундах
  • void setSingleShot(bool singleShot)
  • void setTimerType(Qt::TimerType atype) — устанавливает тип таймера
  • int timerId() — возвращает id таймера
  • Qt::TimerType timerType() — возвращает тип таймера

Включает в себя слоты start() и stop(), которые запускают и останавливают таймер соответственно. У слота start() есть одна пеперегрузка — start(int msec), которая через msec миллисекунд запускает таймер, если таймер не запущен, в противном случае таймер останавливается и запускается снова.

Имеет сигнал timeout(), который посылается во время срабатывания таймера.

Рассмотрим на примере использование таймера. Создадим программу, о которой говорилось выше. Она будет показывать текущее время, а по истечении 5-ти секунд закроется.

В ней применим регулярное срабатывание таймера, оно будет обновлять текущее время на экране каждую секунду.

Также применим статическую функцию singleShot() для единичного срабатывания, которое пошлет сигнал для закрытия программы.

Создадим проект в Qt Creator, выберем шаблон проекта «Приложение Qt Widgets» или «Application Qt Widgets».

Приложение Qt Widgets

Далее дадим ей любое название, я же назвал «Timer». Остальные параметры по умолчанию.

В дереве проекта переходим в директорию «Формы» | «Forms» и открываем mainwindow.ui. Откроется редактор интерфейсов. В нем нам нужно положить объект Label на форму.

При желании его можно оформить, что я собственно и сделал.

Label на форме

Как видно, я растянул его и увеличил шрифт. Значение «00:00:00» вставил, чтобы было видно размер шрифта.

Далее переходим в «Редактор»|»Edit» -> «Заголовочные»|»Headers»->mainwindow.h.

Подключаем два заголовочных файла и . Класс QTime содержит метод currentTime(), который возвращает текущее время, оно пригодится нам в программе.

#include #include

В этом же файле в классе MainWindow объявим указатель закрытого типа(private) на объект класса QTimer

В ней будет храниться указатель на наш таймер.

Объявим закрытый слот updateTime()

private slots: void updateTime();

Он будет обновлять время на экране.

Весь листинг файла mainwindow.h

#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); private: Ui::MainWindow *ui; QTimer *tmr; //Адресная переменная таймера private slots: void updateTime(); //Слот для обновления времени на экране }; #endif // MAINWINDOW_H

class MainWindow : public QMainWindow    explicit MainWindow(QWidget *parent = 0);    QTimer *tmr; //Адресная переменная таймера    void updateTime(); //Слот для обновления времени на экране

Теперь перейдем в файл mainwindow.cpp («Исходники»|»Source» -> mainwindow.cpp)

В этом файле определим слот updateTime() класса MainWindow

void MainWindow::updateTime() { ui->label->setText(QTime::currentTime().toString()); }

void MainWindow::updateTime()    ui->label->setText(QTime::currentTime().toString());

Слот изменяет значение поля text объекта label в нашей форме, помещает в нее значение текущего времени.

Статический метод QTime::currentTime() возвращает текущее время, методом toString() мы его преобразовываем в строку, т.к.

метод setText(QString arg) принимает на вход только QString. Будем посылать сигнал в этот слот каждую секунду, чтобы обновлялось текущее время на экране.

Далее в конструкторе класса MainWindow создадим новый объект таймера QTimer и передадим его адрес нашей переменной tmr

Зададим интервал таймера в 1 секунду (1 секунда = 1000 миллисекунд)

Соединим сигнал timeout() таймера tmr со слотом updateTime() объекта класса MainWindow

connect(tmr, SIGNAL(timeout()), this, SLOT(updateTime()));

connect(tmr, SIGNAL(timeout()), this, SLOT(updateTime()));

Теперь таймер будет посылать сигнал в наш слот.

Далее сразу же запустим таймер

Метод start() может вызываться с параметром типа int, он задает интервал таймера. Например:

tmr->start(1000); 

Таким образом таймер после запуска будет посылать сигнал с интервалом 1000 мс (каждую секунду).

Листинг файла mainwindow.cpp

#include “mainwindow.h” #include “ui_mainwindow.h” MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); tmr = new QTimer(this); // Создаем объект класса QTimer и передаем адрес переменной tmr->setInterval(1000); // Задаем интервал таймера connect(tmr, SIGNAL(timeout()), this, SLOT(updateTime())); // Подключаем сигнал таймера к нашему слоту tmr->start(); // Запускаем таймер } MainWindow::~MainWindow() { delete ui; delete tmr; } void MainWindow::updateTime() { ui->label->setText(QTime::currentTime().toString()); // Обновляем время на экране }

#include “ui_mainwindow.h”MainWindow::MainWindow(QWidget *parent) :    tmr = new QTimer(this); // Создаем объект класса QTimer и передаем адрес переменной    tmr->setInterval(1000); // Задаем интервал таймера    connect(tmr, SIGNAL(timeout()), this, SLOT(updateTime())); // Подключаем сигнал таймера к нашему слоту    tmr->start(); // Запускаем таймерMainWindow::~MainWindow()void MainWindow::updateTime()    ui->label->setText(QTime::currentTime().toString()); // Обновляем время на экране

В итоге наша программа отображает время и каждую секунду обновляет его. Далее нам нужно «научить» программу закрываться через 5 секунд, для этого переходим к редактированию файла main.cpp («Исходники»|»Sources» -> main.cpp)

В нем тайкже подключим заголовочный файл QTimer

Далее после кода, в котором создается обект окна, вызываем статический метод singleShot() класса QTimer.

QTimer::singleShot(5000, &w, SLOT(close()));

QTimer::singleShot(5000, &w, SLOT(close()));

Первый параметр метода singleShot() задает значение в миллисекундах, по истечении которых будет послан сигнал.

Второй параметр принимает на вход адрес объекта.

В третьем параметре указывается слот входного объекта.

Листинг файла main.cpp

#include “mainwindow.h” #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); QTimer::singleShot(5000, &w, SLOT(close())); return a.exec(); }

int main(int argc, char *argv[])    QApplication a(argc, argv);    QTimer::singleShot(5000, &w, SLOT(close()));

С редактированием кода всё, осталось запустить нашу программу.

После сборки и запуска появляется такое окно

Окно программы

Время обновляется каждую секунду. После пяти секунд программа закрывается.

Итак, мы узнали о классе QTimer, научились создавать новые таймеры и применили эти знания на практике.

Существуют еще один класс QBasicTimer, который обеспечивает события таймера для объектов, но в данной статье не рассмотрен.

Источник: https://nicknixer.ru/programmirovanie/qtimer-sozdanie-tajmera-i-obrabotka-ego-sobytij-s-primerom-programmy/

СекретЗдоровья
Добавить комментарий