使用QSocketNotifier在字符设备上进行select。

我写了一个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从来没有被调用,我的驱动程序从来没有报告过其调查方法调用。

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

 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,我可以看到来自我的驱动程序的两个民意调查。 一个用于最初的民意调查注册,另一个用于唤醒发生的时间。

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

这样可以使用QSocketNotifier吗? QFile :: handle()的文档似乎表明它应该是。

Solutions Collecting From Web of "使用QSocketNotifier在字符设备上进行select。"

if块结束,你的QSocketNotifer就会被销毁。 它没有任何举报的机会。

只要您想要监视该文件,就必须保持该通道程序活动。 这样做的最简单的方法可能是将一个QSocketNotifer*成员保存在一个类中。

我还会提到可以使用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; };