Использование QSocketNotifier для выбора на символьном устройстве. - PullRequest
7 голосов
/ 30 июля 2011

Я написал драйвер устройства char и сейчас пишу «обертку» QT, которая должна получить сигнал на срабатывание, когда устройство станет читаемым с помощью механизма poll.Я пытался сделать:

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, и я вижу два вызова опроса от моего драйвера.Один для начальной регистрации в опросе и один для случая, когда происходит wake_up.

Делая это таким образом, я, вероятно, должен был бы порождать отдельный поток, который все, что он делал, это опрос на этом устройстве и генерирование сигнала и петли.

Можно ли использовать QSocketNotifier таким образом?Документация QFile :: handle () , кажется, указывает, что это должно быть.

Ответы [ 2 ]

14 голосов
/ 12 сентября 2011

Я также упомяну, что QSocketNotifier можно использовать для просмотра стандартного ввода, используя следующий

#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);
}

--- Header

#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;
};
8 голосов
/ 31 июля 2011

Ваш QSocketNotifer уничтожается, как только этот блок if заканчивается. У него нет шансов сообщить что-либо.

Вы должны поддерживать этот уведомитель сокета так долго, как хотите, чтобы этот файл отслеживался. Самым простым способом сделать это, вероятно, является сохранение члена QSocketNotifer* в одном из ваших классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...