C++ 使用QSocketNotifier在char设备上进行选择。

C++ 使用QSocketNotifier在char设备上进行选择。,c++,linux,qt4,C++,Linux,Qt4,我编写了一个char设备驱动程序,现在正在编写一个QT包装器,其中的一部分是在设备通过轮询机制变得可读时获取要触发的信号。我试着做: QFile file("/dev/testDriver"); if(file.open(QFile::ReadOnly)) { QSocketNotifier sn(file.handle(), , QSocketNotifier::Read); sn.setEnabled(true); connect(&sn, SIGNAL(activate

我编写了一个char设备驱动程序,现在正在编写一个QT包装器,其中的一部分是在设备通过轮询机制变得可读时获取要触发的信号。我试着做:

QFile file("/dev/testDriver");
if(file.open(QFile::ReadOnly)) {
  QSocketNotifier sn(file.handle(), , QSocketNotifier::Read);
  sn.setEnabled(true);
  connect(&sn, SIGNAL(activated(int)), &this, SLOT(readyRead()));
}
但readyRead从未被调用,我的驱动程序也从未报告调用过它的poll方法

我能够让下面的代码工作,所以我知道我的驱动程序正在工作

QFile file("/dev/testDriver");
if(file.open(QFile::ReadOnly)) {
    struct pollfd fd;
    fd.fd = file.handle();
    fd.events = POLLIN;

    struct pollfd fds[] = {fd};
    int ready;
    qDebug() << "Started poll";
    ready = poll(fds, 1, -1);
    qDebug() << "Poll returned: " << ready;

    QTextStream in(&file);
    QTextStream out(stdout);
    out << in.readAll();
}
这将正确地等待我的驱动程序调用wake_up,我可以看到来自我的驱动程序的两个轮询调用。一个用于初始投票登记,另一个用于唤醒时间

这样做的话,我可能会产生一个单独的线程,它所做的只是在这个设备上轮询并抛出一个信号和循环

可以这样使用吗?的文档似乎表明它应该被销毁。

如果区块结束,您的QSocketNotifer将立即被销毁。它不可能报告任何事情


只要希望监视该文件,就必须保持套接字通知程序处于活动状态。最简单的方法可能是在您的一个类中保留一个QSocketNotifier*成员。

我还将提到,QSocketNotifier可用于使用以下命令监视stdin

#include "ConsoleReader.h"
#include <QTextStream>

#include <unistd.h> //Provides STDIN_FILENO

ConsoleReader::ConsoleReader(QObject *parent) :
    QObject(parent),
    notifier(STDIN_FILENO, QSocketNotifier::Read)
{
    connect(&notifier, SIGNAL(activated(int)), this, SLOT(text()));
}

void ConsoleReader::text()
{
    QTextStream qin(stdin);
    QString line = qin.readLine();
    emit textReceived(line);
}
--标题

#pragma once

#include <QObject>
#include <QSocketNotifier>

class ConsoleReader : public QObject
{
    Q_OBJECT
public:
    explicit ConsoleReader(QObject *parent = 0);
signals:
    void textReceived(QString message);
public slots:
    void text();
private:
    QSocketNotifier notifier;
};

谢谢你。想想看,可能是这么简单的事情。QSocketNotifier现在工作正常。您可以添加QFile作为QSocketNotifier的父级,然后当QFile被删除时,QSocketNotifierId是否可以工作?我写了一些类似的东西,但我无法让file->readbuf,1工作。它只会挂起来。然而,readfile->handle,buf,1工作得很好。@Harvey是的,我检查的答案对我很有用。结果证明是一个简单的编码错误。另外,请查看我的答案,看看它是否对您有帮助。为了修改我之前的评论,我对设备驱动程序的工作原理存在误解。这两段代码都起作用了,当我使用其中一段代码时,碰巧我的其他因素导致整个测试失败,导致我建立了错误的连接。感谢阅读stdin的优雅方式。然而,国际海事组织有两个问题:1。std::getlinestd::cin,行;应使用而不是QTextStream。原因是QTextStream使用了某种缓冲,这在将带有\n的文本粘贴到终端时是有问题的。某些文本将丢失。可能QTextStream成员也可以工作。2.最好在堆上以ConsoleReader作为父级创建通知程序。这样,如果将来需要,它将与ConsoleReader一起自动移动到新线程。请记住,stdin不是线程安全的。