gpt4 book ai didi

c++ - Qt 退出事件循环

转载 作者:太空宇宙 更新时间:2023-11-04 11:43:28 24 4
gpt4 key购买 nike

我想监控连接到 Beaglebone 的自定义设备中的紧急停止按钮,我的代码是使用 Qt 4.6 开发的。

此刻,当按下紧急停止按钮时,我成功地“显示”了一个消息框(没有任何按钮)。我想要做的是在释放紧急停止按钮时 ONLY 继续执行程序。按钮按下/释放在每个事件上发出单独的信号。但是,使用此代码永远不会检测到 EmergencyStopIsInactive 信号。

QEventLoop loop;
connect(this, SIGNAL(EmergencyStopIsInactive()), &loop, SLOT(quit()));
loop.exec(QEventLoop::AllEvents);

qDebug() << "Emergency Stop Deactivated";

事实上,使用断点我可以看到它永远不会生成。 Eventloop 似乎没有收到信号。

如果我使用断点注释掉 loop.exec 行,我可以看到代码发出了信号。重新输入 exec 命令后,我们永远不会到达断点。

exec() 似乎不允许应用程序处理事件。

我能让它按我想要的方式工作吗?怎么办?

问候,詹姆斯

=======================================编辑:这是生成初始信号的代码:

// Set up Emergency Stop Input
EmStop = new mita_gpio;
EmStop->initgpio_read(49);
connect(EmStop,SIGNAL(StateOutput(unsigned int)), this, SLOT(update_EmStop(unsigned int) ) );
connect(EmStop,SIGNAL(StateOutput(unsigned int)), Test_Screen, SLOT(update_EmStop(unsigned int) ) );
connect(this,SIGNAL(EmergencyStopIsInactive()), Probe_Screen, SLOT(quit() ) );
connect(Probe_Screen,SIGNAL(ShowEmergencyStopScreen()),this,SLOT(EmergencyStopScreenShow()) );

此信号然后链接到以下内容:

void Manager::update_EmStop(unsigned int state_value)
{
if (state_value == 1)
{
MitaData.EmergencyStop = 1;
emit EmergencyStopIsActive();
qDebug() << "Emergency Stop = 1";
}
else
{
MitaData.EmergencyStop = 0;
emit EmergencyStopIsInactive();
qDebug() << "Emergency Stop = 0";
}
}

最佳答案

SIGNAL(EmergencyStopIsInactive()) 正在您程序的主事件循环中执行(我的逻辑假设)。

当您开始一个新的事件循环时,您会使用阻塞函数 exec 运行它,因此尽管您的新循环正在运行,但您正在阻塞主事件循环。

loop.exec(QEventLoop::AllEvents);

由于您的信号应该从主循环发送,它被您的阻塞函数 loop.exec 阻塞,因此在 loop.exec 返回之前它永远不会被发送。


要解决该问题,是从“loop” 事件循环中生成 EmergencyStopIsInactive() 信号,还是将第二个循环放在单独的线程中。

关于c++ - Qt 退出事件循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20540972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com