C++ 使用QSocketNotifier在char设备上进行选择。
我编写了一个char设备驱动程序,现在正在编写一个QT包装器,其中的一部分是在设备通过轮询机制变得可读时获取要触发的信号。我试着做: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
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(¬ifier, 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不是线程安全的。