2011-07-29 2 views
7

나는 char 디바이스 드라이버를 작성했으며, 폴링 메커니즘을 통해 디바이스를 읽을 수있게되면 신호를 보내는 부분이 QT "wrapper"를 작성 중이다. 나는하려고했었다 :QSocketNotifier를 사용하여 문자 장치를 선택하십시오.

readyRead는 결코 호출되지 않았고 드라이버는 poll 메소드를 호출하는 것을 결코보고하지 않았다.

나는 내 드라이버 내 드라이버가 wake_up 전화와 나는 두 개의 설문 조사 내 드라이버에서 호출을 볼 수에 대한이 제대로 기다립니다

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()의 설명서가 있어야 함을 나타냅니다.

+0

를 사용하여 표준 입력을 볼 수 있습니다 언급거야? 나는 비슷한 것을 썼지 만'file-> read (buf, 1)'를 쓸 수 없었다. 그냥 매달릴거야. 그러나'read (file-> handle(), buf, 1)'는 정상적으로 작동했다. – Harvey

+0

@Harvey 네, 확인한 대답이 나를 위해 일했습니다. 간단한 코딩 오류로 판명되었습니다. 또한 내 대답을 확인하여 도움이되는지 확인하십시오. – jjcf89

+0

이전 코멘트를 수정하려면 장치 드라이버 작동 방식에 대한 오해가있었습니다. 두 코드 모두 작동했는데, 그 중 하나를 사용하여 오류 연결을 만들 때 다른 요인으로 인해 전체 테스트가 실패하게되었습니다. – Harvey

답변

7

QSocketNotifer은 블록이 끝나 자마자 즉시 파괴됩니다. 아무 것도보고 할 기회가 없습니다.

해당 파일을 모니터링하려는 경우 해당 소켓 알림을 활성 상태로 유지해야합니다. 가장 간단한 방법은 아마도 QSocketNotifer* 회원을 수업 중 하나에 유지하는 것입니다.

+0

감사합니다. 그것이 너무 단순한 무언가 일 수 있던 숫자를 가십시오. QSocketNotifier는 이제 괜찮습니다. – jjcf89

+0

QFile을 QSocketNotifier의 부모로 추가 한 다음 QFile을 삭제하면 QSocketNotifier도 추가됩니다. – RDP

13

는 또한 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); 
} 

--- 헤더

#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에서 우아한 방법을 읽어 주셔서 감사합니다. 그러나 이모에는 두 가지 문제가 있습니다. 1. std :: getline (std :: cin, line); QTextStream 대신 사용해야합니다. 이유는 QTextStream이 버퍼링을 사용하기 때문에 \ n이있는 텍스트를 터미널에 붙여 넣을 때 (일부 텍스트가 손실 될 수 있습니다) 문제가되는 것입니다. QTextStream 멤버도 가능합니다. 2. ConsoleReader를 부모로 사용하여 힙에 알림을 만드는 것이 좋습니다. 이렇게하면 나중에 필요할 경우 자동으로 ConsoleReader와 함께 새 스레드로 이동됩니다. stdin은 스레드로부터 안전하지 않습니다. – Adam

관련 문제