QSocketNotifier和QFile :: readAll()

时间:2014-06-02 07:37:03

标签: c++ linux qt debian qfile

目前正在研究SBC(Olimex A20)的GPIO,我遇到了QSocketNotifier的问题。在我的GPIO上,我正在使用具有中断功能的引脚(对于那些想要了解更多信息的人:https://developer.ridgerun.com/wiki/index.php/How_to_use_GPIO_signals )和一个QSocketNotifier来监控变化。

这是我的班级中断:

OLinuXinoGPIOEdge::OLinuXinoGPIOEdge(int num)
    : m_gpioNumber(num), m_value(false), m_direction(IN)
{
    this->exportGPIO(); // equivalent to 'echo num > export'
    this->setDirection(IN); // for security
    m_fileValue.setFileName("/sys/class/gpio/gpio20_pi11"); // the path of the pin
    this->setEdge(BOTH); // edge's detection (both/falling/rising/none)
    m_timer = new QTimer();
    m_timer->setInterval(10);
    m_timer->setSingleShot(true);
    m_fileValue.open(QFile::ReadOnly);
    m_fileNotifier = new QSocketNotifier(m_fileValue.handle(), QSocketNotifier::Exception); // Actually, emits the signal whenever an interruption is raised or not
    connect(m_fileNotifier, SIGNAL(activated(int)), m_timer, SLOT(start()));
    connect(m_timer, SIGNAL(timeout()), this, SLOT(changeNotifier()));
}

我已经问了一个问题(这里:https://stackoverflow.com/questions/23955609/qtimer-and-qsocketnotifier),但问题发生了变化,所以我再次提问。

为什么QSocketNotifier会不断发出信号?在GPIO的目录中,可以修改文件“edge”以在下降,上升,两个边缘或没有边缘时引发中断,这意味着只应在此边缘上引发中断。

1 个答案:

答案 0 :(得分:1)

好的,我有我的解决方案:QSocketNotifier持续发出信号,直到你在文件上使用“readAll()”函数。所以需要尽快调用readAll()来阻止QSocketNotifier的垃圾邮件。