Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct
Проблема при соединении нескольких сигналов с одним слотом
-
Приветствую! Меня мучает один вопрос, надеюсь умные люди подскажут.
Допустим, в 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]