2011-07-29 8 views
7

私はcharデバイスドライバを書きましたが、ポーリングメカニズムを介してデバイスが読み込み可能になったときに起動するシグナルを得ることが、QT「ラッパー」を作成しています。私はしようとしました:QSocketNotifierを使用してcharデバイスを選択します。

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メソッドの呼び出しを報告しませんでした。

私はので、私は私のドライバーはこれが適切にWAKE_UPコールすると、私は私の運転手から2つのポールの呼び出しを見ることができ、私のドライバを待ち

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

を働いている知って動作するように、次のコードを取得することができました。 1つは最初の投票登録用で、もう1つはwake_upが発生したときのものです。

このようにすると、おそらくこのデバイスでポーリングを行い、シグナルとループを投げるという別のスレッドを生成する必要があります。

このようにQSocketNotifierを使用することはできますか? QFile::handle()のドキュメントは、それがあるべきであると思われるようです。

+0

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

を使用して標準入力を監視するために使用できることも言及しますか?私は同様のことを書いたが、 'file-> read(buf、1)'を動作させることができなかった。それはちょうどハングアップします。しかし、 'read(file-> handle()、buf、1)'はうまく動きました。 – Harvey

+0

@Harveyはい私がチェックした答えは私のために働いた。単純なコーディングエラーであることが判明しました。私の答えをチェックして、それがあなたに役立つかどうかを確認してください。 – jjcf89

+0

私の以前のコメントを修正するために、デバイスドライバの仕組みについて私が誤解していました。両方のコードがうまくいきました。私が他の要因によってテスト全体が失敗し、そのうちの1つを使って誤った接続を行うと、 – Harvey

答えて

7

QSocketNotiferはブロックが終了するとすぐに破棄されます。それは何かを報告するチャンスがありません。

このファイルを監視したい限り、そのソケット通知機能を有効にしておく必要があります。これを行う最も簡単な方法はおそらくQSocketNotifer*のメンバーをあなたのクラスの1つに保つことです。

+0

ありがとうございました。それは簡単なことかもしれません。 QSocketNotifierはうまく動作します。 – jjcf89

+0

QFileをQSocketNotifierの親として追加し、その後QFileを削除した場合は、QSocketNotifierも同様です。 – RDP

13

私はあなたがこの作業を取得しましたヘッダ

#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; 
}; 
+0

stdinからの読み方をありがとうございます。しかし、imoには2つの問題があります。 1. std :: getline(std :: cin、line); QTextStreamの代わりに使用する必要があります。その理由は、QTextStreamは何らかの種類のバッファリングを使用しています。これは、\ nをテキストに貼り付けたときに問題になります(テキストの一部が失われます)。おそらくQTextStreamメンバーも機能します。 2. ConsoleReaderを親としてヒープ上にnotifierを作成する方がよいでしょう。これにより、将来必要になった場合に自動的にConsoleReaderと共に新しいスレッドに移動されます。 stdinはスレッドセーフではないことに注意してください。 – Adam

関連する問題