Проблема при соединении нескольких сигналов с одним слотом



  • Приветствую! Меня мучает один вопрос, надеюсь умные люди подскажут.
    Допустим, в GUI-приложении есть несколько сигналов, привязанных к одному слоту. Пусть сигналы генерируются с малой разницей во времени, очень быстро, а отработка слота занимает время, соизмеримое с этой разницей. В моем примере получается, что слот начинает обрабатывать сигналы в одном порядке, а заканчивает в другом, и я хоть убей не могу понять почему.
    Допустим, источники сигналов - три таймера с singleShot(true).
    //--dialog.h--

    private slots:
        void on_TimerTick();
        void on_pushButton_clicked();//старт таймеров
    
    private:
        Ui::Dialog *ui;
        void Print(QString message);
        QTimer* tmr1;
        QTimer* tmr2;
        QTimer* tmr3;
        void mySleep(int msec);
    };
    

    //---dialog.cpp---

    //constructor
    {
        tmr1 = new QTimer(this);
        tmr2 = new QTimer(this);
        tmr3 = new QTimer(this);
    
        tmr1->setObjectName("tmr1");
        tmr2->setObjectName("tmr2");
        tmr3->setObjectName("tmr3");
    
        tmr1->setSingleShot(true);
        tmr2->setSingleShot(true);
        tmr3->setSingleShot(true);
    
        connect(tmr1, &QTimer::timeout, this, &Dialog::on_TimerTick);
        connect(tmr2, &QTimer::timeout, this, &Dialog::on_TimerTick);
        connect(tmr3, &QTimer::timeout, this, &Dialog::on_TimerTick);
    }
    //--------
    void Dialog::Print(QString message)
    {
        ui->textBrowser->append(message);
    }
    void Dialog::mySleep(int msec)//имитация задержки в работе слота
    {
        QEventLoop loop;
        QTimer::singleShot(msec, &loop, SLOT(quit()));
        loop.exec();
    }
    //собственно, проблемный слот
    void Dialog::on_TimerTick()
    {
        Print(QString("Started ") + QObject::sender()->objectName());
        mySleep(2);
        Print(QString("Stopped ") + QObject::sender()->objectName());
    }
    void Dialog::on_pushButton_clicked()
    {
        tmr1->start(1);
        tmr2->start(1);
        tmr3->start(1);
    }
    

    //=====Вывод:======

    Started tmr3
    Started tmr1
    Started tmr2
    Stopped tmr2
    Stopped tmr1
    Stopped tmr3
    

    //=================
    Все срабатывания слота происходят в одном потоке, в главном, так что я даже мьютекс не могу поставить, ведь тогда поток будет ждать сам себя. Что делать? И почему так получается? Спасибо

    [На английском: https://forum.qt.io/topic/81862/a-problem-with-single-slot-connected-to-multiple-signals ~kshegunov]


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.