Qt退出事件循环

时间:2013-12-12 10:30:08

标签: c++ qt

我想监视连接到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";
    }
}

1 个答案:

答案 0 :(得分:1)

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

当你启动一个新的事件循环时,你使用阻塞函数exec运行它,因此尽管你的新循环正在运行,你仍然阻止了主事件循环。

loop.exec(QEventLoop::AllEvents);

由于您的信号应该从主循环发送,但是被阻塞函数loop.exec阻止,它将永远不会被发送,直到loop.exec返回。

要解决该问题,是否从&#34;循环&#34; 事件循环中生成EmergencyStopIsInactive()信号,或将此第二个循环放在单独的线程中。