我陷入了一个合乎逻辑的第 22 条军规。让我澄清一下我想做什么:按下按钮将触发电机移动,直到感觉到传感器(向我的 Rpi GPIO 发送 3.3V),此时它将反转方向。这一切都很好;问题是,它陷入了无限循环,所以如果我想按另一个按钮,例如提高速度,或者在运行过程中停止,嗯,我不能。 我曾尝试将“wiringPiISR()”实现为中断,但这似乎也在循环中以使用react。
请记住,以下只是一项测试,目的是让某些东西正常工作,以适应更大的代码段。
#include <libraries>
using namespace std;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->label->setText("Nothing");
}
MainWindow::~MainWindow()
{
delete ui;
}
void myInterruptLEFT(void)
{
qDebug() << "SENSOR HIT";
}
void mainip(void)//this doesn't currently do anything.
{
wiringPiISR(24,INT_EDGE_RISING,&myInterruptLEFT);
}
void MainWindow::on_pushButton_clicked()
{
qDebug() << "Loop Exited";
}
void MainWindow::on_checkBox_clicked(bool checked)
{ int i = 0;
wiringPiSetupGpio();
while((checked =! 0))
{
ui->label->setNum(i);
i++;
}
}
再一次,我只是想要一些方法让这个程序不断检查“24,INT_EDGE_RISING”......对于那些不熟悉的人来说,这意味着有一些电压被传递到第 24 个 GPIO 引脚(从低电压上升到高电压)......而不会完全被这样做迷住。背景循环,或者我真的不知道,这就是我来这里的原因。任何想法将不胜感激!
最佳答案
我不确定我是否完全理解你的问题,但也许你可以建立一个只有一个循环的状态机来检查所有按钮按下并执行所有必要的操作,即你的 on_checkBox_clicked
会只需设置一个标志,然后在主循环中检查该标志。像这样的东西(伪代码):
void MainWindow::on_checkBox_clicked(bool checked) {
checkBox_wasClicked = true;
}
for (;;) {
if (checkBox_wasClicked) {
state = move_motor;
checkBox_wasClicked = false;
} else if (motor_reached_end) {
state = move_motor_reverse;
motor_reched_end = false;
} else if ( /*... more transitions ... */ ){
}
if ( state == motor_move ) {
i++;
}
/* .... more stuff ... */
}
通过这种方式,没有状态会阻止新按钮按下或其他转换的到来。
关于c++ - 在等待用户输入时避免无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38740702/