Использование QSocketNotifier для выбора на символьном устройстве.

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

Поступая таким образом, мне, вероятно, пришлось бы создать отдельный поток, который все, что он сделал, - это опрос на этом устройстве, выдающий сигнал и цикл.

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

8
задан casperOne 27 April 2012 в 20:46
поделиться