使用QSocketNotifier对字符设备进行选择
Using QSocketNotifier to select on a char device.
我写了一个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从来没有被调用过,我的driver也从来没有报告它的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,我可以看到我的驱动程序的两个轮询调用。一个用于初始轮询注册,另一个用于wake_up发生时。
这样做,我可能不得不生成一个单独的线程,它所做的就是在这个设备上轮询,并抛出一个信号和循环。
是否可以这样使用QSocketNotifier ?QFile::handle()的文档似乎表明它应该是。
我还将提到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;
};
一旦if
块结束,您的QSocketNotifer
就会被破坏。它不可能报告任何东西。
只要您希望监视该文件,就必须使该套接字通知程序保持活动状态。最简单的方法可能是在你的一个类中保留一个QSocketNotifer*
成员。
相关文章:
- QTreeView幻灯片多选后无法使用单击选择
- 在PostgreSQL中根据它们的ID选择大量行的最快方法是什么?
- 组合框第一行不可选择
- 计算所选行的总和
- 选择特定版本的 Visual Studio 命令行工具包,并根据特定版本的C++运行时环境编译文件
- extensor:选择具有特定列值的行
- 从 QTreeView 中删除项目时取消选择所有行
- 复制矩阵选择不复制的行
- 为什么QTableView扩展选择忽略了我的默认选择行
- 如何在 TStringGrid 中启用多行选择
- 当列中的属性与eigen,c 中的给定条件匹配时,仅选择这些行froom a矩阵
- Delphi / C 构建器 - 在TDBGrid中设置活动 /选择的行颜色
- 如何从 gtkmm 树视图中获取所选行
- 如何在多行文本C++的左上角显示复选框
- CListCtrl GetSelectionMark() 未返回正确选择的行
- 如何将所选行的第一列值绑定到变量并在 QT 的 SQL 命令中使用它?
- 在win API中带有图像和整行选择的组合框
- QTable查看如何确定是否选择了“行”
- 如何让我的QTableView与QSqlTableModel具有复选框和多行?
- 从 QT 复选框到 Postgresql 选择星期几