Home > Software engineering >  How to make a QTimer as Idle timer in qt using CPP
How to make a QTimer as Idle timer in qt using CPP

Time:03-02

I am new to Qt programming, I want to make the timer an idle timer. The question is whether just setting the timer->start(0) will make the timer an idle timer? How can I know it's an idle timer.

CodePudding user response:

I'd like to repeat the concerns of Snapshot of Task Manager (while testQTimer0.exe running)

An application with timeout 0 occupies (more than) one core permanently and causes a high currency consumption.


Here we go: a QTimer with interval 0:

#include <QtWidgets>

// main application

int main(int argc, char **argv)
{
  qDebug() << "Qt Version:" << QT_VERSION_STR;
  QApplication app(argc, argv);
  // setup GUI
  QWidget qWinMain;
  qWinMain.setWindowTitle("QTimer - timeout 0");
  QVBoxLayout qVBox;
  QLabel qLblText("Attention!\nThis may cause ventilation noise.");
  qVBox.addWidget(&qLblText);
  QLabel qLblI;
  qVBox.addWidget(&qLblI);
  qWinMain.setLayout(&qVBox);
  qWinMain.show();
  QTimer qTimer;
  qTimer.setInterval(0);
  ushort i = 0;
  // install signal handlers
  QObject::connect(&qTimer, &QTimer::timeout,
    [&]() {
        i;
      if (i) qLblI.setText(QString("i: %1").arg(i));
      else app.quit();
    });
  // runtime loop
  qTimer.start();
  return app.exec();
}

Output:

Snapshot of testQTimer0 (GIF Animation)

The interval 0 makes the timer immediately due. This means that a timeout event is appended to the event queue.

Thus, I expect the queue permanently filled with timeout and paint events (for update of qLblI) until the application exits.


I once used such an idle event in the past (before I started to use Qt). I intended to combine the UI event loop with polling "events" from a different source (and lacking any idea about a better alternative). Thereby, the polling function provided itself a time-out option. Thus, the call of the poll function suspended itself the process until either an event came in or the timeout was reached. The most intricate thing was to achieve somehow a load balancing as I tried to distribute the available time equally between the UI and the processing of the other event source. (This was important for the situation where UI events were approaching in high frequency concurrently with the other event source.)

However, I doubt that such a fiddling would be still necessary in Qt. For such a concurrency, there are better options e.g. to run a blocking function in a separate thread.

  • Related