Использование QSocketNotifier для выбора на устройстве char.
Я написал драйвер устройства 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 () кажется, указывает, что это должно быть.
2 ответов
код QSocketNotifer
уничтожается, как только это if
блок заканчивается. У него нет шансов что-либо сообщить.
вы должны сохранить этот уведомитель сокета живым, пока вы хотите, чтобы этот файл контролировался. Самый простой способ сделать это, вероятно, держать 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(¬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;
};