Слот QTimer срабатывает несколько раз? - PullRequest
0 голосов
/ 05 мая 2019

Я создаю приложение для пользовательского интерфейса Raspberry PI для чтения данных с датчика в течение определенного времени (5 секунд). Проблема в том, что интервал ожидания QTimer вызывается несколько раз

{   //at system init
readTempCur = new QTimer(this);
connect(readTempCur, SIGNAL(timeout()), this, SLOT(readSensor()));
readTempCur->start(SAMPLINGTIME);
readSensor();   //added to call on boot itself, can be removed
}
void HomePage::readSensor(void) {
   readTempCur->stop();
   qDebug() << "Read Sensor triggerred at " <<QDateTime::currentDateTime().toString();
   //DO my actions
   readTempCur->start(SAMPLINGTIME);
 }

Screenshot for QTimer triggered multiple times

[редактировать для ответа] Наиболее вероятным случаем такой проблемы является подключение слота к сигналу, который уже подключен; это вызовет слот 'n' число раз, когда он был подключен, проект должен позаботиться о том, чтобы снова не подключаться.

Ответы [ 2 ]

1 голос
/ 05 мая 2019

Функция QTimer :: start запускает / перезапускает таймер.

Ваша функция readSensor останавливает таймер и затем перезапускает его.

удалитьstart чтобы исправить это.

void HomePage::readSensor(void) {
   readTempCur->stop();
   qDebug() << "Read Sensor triggerred at " <<QDateTime::currentDateTime().toString();
   //DO my actions
   //readTempCur->start(SAMPLINGTIME);
 }

PS Если вы хотите запустить таймер, как только вы можете использовать singleShoot

QTimer::singleShot(SAMPLINGTIME, this, SLOT(readSensor()));
0 голосов
/ 05 мая 2019

Не останавливайте и не перезапускайте таймер в readSensor(). Просто сделай:

void HomePage::readSensor(void)
{
    qDebug() << "Read Sensor triggerred at " <<QDateTime::currentDateTime().toString();
    //DO my actions
}

Также убедитесь, что SAMPLINGTIME указано в миллисекундах. В течение 5 секунд SAMPLINGTIME должно быть 5000.

...