如何在 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();
我是 Qt GUI 框架的新手,正在学习。
我有一个连接到 Raspberry Pi 的超声波传感器来测量水位。如果我用 C 编写代码,我会使用 while(1)
循环来不断读取传感器输入。但是当我把while(1)
放在MainWindow.cpp里面的时候,就不能显示window。但是,使用 qDebug()
我仍然可以打印出传感器值,这意味着我的 while(1)
仍然 运行 但主要的 window 不会出现。我在 while(1)
,
MainWindow
ctor never returns, sow.show()
is never called anda.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();