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
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:
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.