MyTetra Share
Делитесь знаниями!
Как сделать задержку в Qt
Время создания: 25.11.2017 11:56
Автор: Xintrea
Текстовые метки: c++, qt, задержка, остановка, приостановка, пауза, время, sleep, таймер
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Библиотека Qt - Нестандартное использование Qt
Запись: xintrea/mytetra_syncro/master/base/1511600162evxch4q7yk/text.html на raw.github.com

В событийно-ориентированном программировании (event driven programming), в парадигме которого спроектирован Qt, нет причин в создании задержек в коде. Вместо этого следует использовать, например, класс QTimer, который с заданной частотой может вызывать нужные функции (методы).


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



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::msleep(2000);



Зачем нужно так заморачиваться, неужели нельзя просто вызвать QThread::sleep(secs) и иже с ним? Напрямую вызвать не получится, так как методы sleep, msleep, usleep - они оформлены как static protected в классе QThread. И потому их можно вызывать только изнутри самого класса, либо изнутри наследников данного класса.


Второй вопрос: а не будут ли эти методы приостанавливать только тот тред, которому они принадлежат? И поэтому их не имеет смысл вызывать в коде произвольного объекта, размещенного в каком-то треде? Ответ - задержка будет нормально работать в коде любого объекта. Потому что описание этих методов в Qt выглядит так: "Принудительная остановка текущего треда на заданное количество секунд". Кроме того, данные методы в классе QThread оформлены как static protected. А это значит, что данные статические методы не принадлежат ни одному объекту, а являются просто функциями в рамках класса. И эти функции просто берут указатель на текущий тред и в рамках его производят временную задержку.


Еще раз следует напомнить: в продакшене такое использовать не рекомендуется. Данная методика пригодна именно в момент экспериментирования с кодом.


 
MyTetra Share v.0.65
Яндекс индекс цитирования