私は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()のドキュメントは、それがあるべきであると思われるようです。
--- QSocketNotifierは、以下の
を使用して標準入力を監視するために使用できることも言及しますか?私は同様のことを書いたが、 'file-> read(buf、1)'を動作させることができなかった。それはちょうどハングアップします。しかし、 'read(file-> handle()、buf、1)'はうまく動きました。 – Harvey
@Harveyはい私がチェックした答えは私のために働いた。単純なコーディングエラーであることが判明しました。私の答えをチェックして、それがあなたに役立つかどうかを確認してください。 – jjcf89
私の以前のコメントを修正するために、デバイスドライバの仕組みについて私が誤解していました。両方のコードがうまくいきました。私が他の要因によってテスト全体が失敗し、そのうちの1つを使って誤った接続を行うと、 – Harvey