Как установить задержку для запуска предстоящего события в Qt - PullRequest
1 голос
/ 14 марта 2019

Я собираюсь использовать задержку для запуска одного события. Как только один процесс завершен, один сигнал испускается, например, mysignal(int timedelay), получатель сигнала инициирует другой процесс сразу после периода заданного времени timedelay после того, как сигнал испущен ,

Существуют ли специальные функции для этого? Отмечу QThread::sleep() или QThread::msleep() может подойдет для решения такой ситуации? Являются ли они лучше, чем использование объекта QTimer и соответственно установка соединения через слот сигнала?

1 Ответ

2 голосов
/ 14 марта 2019

Не используйте QThread::sleep() в главном потоке, где живет цикл событий Qt, поскольку он будет блокировать сигналы, события и т. Д. Вместо этого используйте QTimer, который вызывает функцию, задачей которой является излучение сигнала.

Пример:

#include <QtCore>

class Sender: public QObject
{
    Q_OBJECT
public:
    using QObject::QObject;
    Q_SIGNAL void mysignal(const QString & text);
    void process(){
        /**
         *    process
         */
        int timeout = 1000;
        // send signal after 1000 ms
        QTimer::singleShot(timeout, this, &Sender::send_signal);
    }
private:
    // The only task of this function is to emit the signal
    void send_signal(){
        qDebug()<< "send signal";
        Q_EMIT mysignal("Hello");
    }
};

class Receiver: public QObject
{
    Q_OBJECT
public:
    using QObject::QObject;
    Q_SLOT void myslot(const QString & text){
        qDebug()<< "Received:" << text;
        QCoreApplication::quit();
    }
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Sender sender;
    Receiver receiver;
    QObject::connect(&sender, &Sender::mysignal, &receiver, &Receiver::myslot);

    // call process
    QTimer::singleShot(1000, &sender, &Sender::process);
    return a.exec();
}

#include "main.moc"
...