如何在 Qt GUI 中正确使用无限循环?

How to properly using infinite loop in Qt GUI?

我是 Qt GUI 框架的新手,正在学习。

我有一个连接到 Raspberry Pi 的超声波传感器来测量水位。如果我用 C 编写代码,我会使用 while(1) 循环来不断读取传感器输入。但是当我把while(1)放在MainWindow.cpp里面的时候,就不能显示window。但是,使用 qDebug() 我仍然可以打印出传感器值,这意味着我的 while(1) 仍然 运行 但主要的 window 不会出现。我在 中发现因为 while(1),

MainWindow ctor never returns, so w.show() is never called and a.exec() (main message loop) is never executed.

为了解决这个问题,我使用 QTimer 而不是循环:将 timeout() SIGNAL 连接到 SLOT,它是一次性读取传感器值的函数:

waterLevelTimer = new QTimer(this);
connect(waterLevelTimer, SIGNAL(timeout()), this, SLOT(getWaterLevel()));
waterLevelTimer->start(100); // "loop" once every 100 millisecond

通过这种方法,我可以读取最快间隔为 1 毫秒的传感器值,并且 GUI 仍然显示正常。

但是我应该使用 QTimer 来模拟 while(1) 循环吗?有没有更好的方法来无限循环读取 GPIO,同时仍然能够使用 GUI 进行其他工作?

Qt 运行s 的 GUI 的主线程永远不应该被像无限 while 循环这样的持久操作阻塞,否则你会阻塞事件系统并且什么都不会再工作。

相反,您通常会并行创建一个工作线程(请参阅 QThread),在该线程的 运行 函数中执行循环。也许也可以使用您建议的计时器,如果执行的代码比计时器持续时间快,它就可以工作。

QThread *thread = QThread::create([]{
    while(1)
        checkSomething();
});
thread->start();