Как периодически проверять переменную с помощью QTimer

У меня есть глобальная переменная, которую я установил в файле cpp в своем проекте qt. Я хочу проверять эту переменную каждые 100 мс в течение 5 секунд, и если переменная равна 0 через 5 секунд, я хочу создать окно сообщения. Вот пример моего кода:

БД.cpp:

if(case){
  g_clickedObj.readFlag = 1 ;
}
else{
g_clickedObj.readFlag = 0 ;
    }

главное окно.cpp

this->tmr = new QTimer();

connect(this->tmr,SIGNAL(timeout()),this,SLOT(callSearchMachine()));

tmr->start(5000); 

person trytobedeveloper    schedule 18.09.2020    source источник
comment
g_clickedObj.readFlag == 1 ; -- Это не может быть код, так как вы используете == вместо =.   -  person PaulMcKenzie    schedule 18.09.2020
comment
Что-то вроде этого? SO: QTimer::timeout не срабатывает   -  person Scheff's Cat    schedule 18.09.2020
comment
Если вы устанавливаете переменную в том же потоке, где находится таймер, я не понимаю, зачем вам нужен QTimer для периодической проверки ее значения. Вместо этого установка переменной может выдать сигнал, и слот (подключенный к этому сигналу) может запустить таймер на 5 секунд, пока не появится окно сообщения. Если бы переменная могла/была бы установлена ​​в другом потоке, это была бы другая история... SO: Как изменить виджеты Qt в потоках WINAPI ?   -  person Scheff's Cat    schedule 18.09.2020


Ответы (2)


Вариант 1. Используйте таймер с интервалом 100 мс для проверки глобальной переменной, удерживайте переменную-член для подсчета количества вызовов слота таймера. Когда слот вызывается 5000/100=50 раз, остановите таймер и при необходимости создайте окно сообщения.

void MyClass::onTimeout(){
    // check variable
    // increment counter
    // check if counter reached 5000/100
    // if so stop timer and create message box
}

Вариант 2. Используйте два счетчика (один с интервалом 100 мс, другой с интервалом 5000 мс), которые имеют два разных слота. Запустите оба счетчика одновременно. Пусть слот таймера 100 мс проверяет глобальную переменную, пусть слот таймера 5000 мс останавливает оба таймера и проверяет глобальную переменную, при необходимости создает окно сообщения.

person zziyaa    schedule 21.09.2020
comment
Могут ли эти параметры работать во время работы других функций моего приложения? У меня есть функция связи в моем приложении, и эта функция должна работать все время во время работы приложения. Я попробовал оба варианта, но моя функция связи перестала работать до истечения времени ожидания таймера. - person trytobedeveloper; 21.09.2020
comment
В этом случае вы должны переместить часть QTimer в другой поток. Вы можете проверить это на stackoverflow.com/a/19252927/12122790. - person zziyaa; 21.09.2020

Это работает для вас? Я не видел необходимости проверять каждые 100 мс, если readFlag не будет установлен на 1 за 5 секунд, вы выведете сообщение об ошибке, иначе ничего не произойдет.

    // where you want to start the 5 second count down...
    QTimer::singleShot(5000, this, SLOT(maybePrintAnErrorMsg()));
    . . .

    // the slot:
    void MyClass::maybePrintAnErrorMsg()
    {
      if (readFlag != 1) {
        // show a QMessageBox;
      }
    }

    . . . somewhere else in your code, when you set readFlag to 1:

    if (case) {
      // when the timer goes off, we won't print an error message
      readFlag = 1;
    }
person David Lawlor    schedule 19.09.2020
comment
Я хочу запустить функцию шлюхи на 5 секунд. То, как вы показываете, вызывает функцию шлюхи через 5 секунд. - person trytobedeveloper; 21.09.2020