【发布时间】:2021-07-26 22:33:18
【问题描述】:
我是 Qt GUI 框架的新手并正在学习。
我有一个连接到 Raspberry Pi 的超声波传感器,用于测量水位。如果我使用 C 进行编码,我会使用 while(1) 循环来不断读取传感器输入。但是当我将while(1) 放入MainWindow.cpp 时,窗口无法显示。但是,使用qDebug() 我仍然可以打印出传感器值,这意味着我的while(1) 仍在运行但不会出现主窗口。我在this answer发现是因为while(1),
MainWindowctor 永远不会返回,因此永远不会调用w.show()并且永远不会执行a.exec()(主消息循环)。
为了解决这个问题,我使用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 进行其他工作?
【问题讨论】:
-
您应该永远在事件驱动程序(基本上所有的 GUI 程序都是)中有无限循环。而构造函数实际上应该只初始化一个对象,而不是执行工作。
-
你的问题的解决方案是一个计时器,而不是一个无限循环。作为一种可能的辅助解决方案,您也许可以使用工作线程,但这可能会增加 GUI 和线程之间的同步和通信的其他复杂性。
-
感谢 cmets!我应该把我的工作执行代码放在哪里?我遵循了几个 Qt 初学者示例,它们都在 MainWindow.cpp 中编写代码。
-
如果您需要定期做某事,计时器 (
QTimer) 是完美的选择,这就是它的用途。它比调用sleep或类似名称的无限循环要好。 -
QTimer可以处理一小时的长间隔吗?
标签: c++ qt raspberry-pi