한국어
Qt
 

QSocketNotifier 클래스는 파일 디스크립터의 활동 모니터링을 지원한다. 

리눅스 또는 유사 시스템에서 어떤 주변장치를 주기적으로 엑세스했던 경우 QSocketNotifier 클래스를 사용하면 간단하게 활동을 감지할 수 있다.

즉, 시스템콜 API를 호출하여 장치를 열고 socket notifier를 통해 파일 디스크립터를 모니터링 할 수 있다.

socket notifier는 해당 소켓 이벤트가 발생할 때마다 activated()시그널을 발생하며 이 스그널에 연결할 슬롯을 구현하면 된다. 

 

아래 간단한 예제 소스코드를 보자.

키보드 장치의 이벤트를 읽는 슬롯을 구현한 클래스이다.

#include <QObject>
#include <unistd.h>
#include <fcntl.h>
#include <linux/input.h>

class KbdHandler : public QObject
{
    Q_OBJECT
public:
    explicit KbdHandler(QObject *parent)
        : QObject(parent),
          m_fd(-1){
    }
    virtual ~KbdHandler(){
    }
    bool setFileDescriptor(int fd){
        if(fd < 0)
            return false;
        m_fd = fd;
        return true;
    }

    int fileDescriptor(){
        return m_fd;
    }

private Q_SLOTS:
    void readData(){
        input_event ev;
        if(read(m_fd, &ev, sizeof(input_event))){
            qDebug() << "code: " << ev.code;

            if(EV_KEY != ev.type)
                return;

            if(ev.value == 1){
                qDebug() << "down";
            }else{
                qDebug() << "up";
            }
        }
    }

private:
    int m_fd;
};

 

QSocketNotifier를 생성시에는 읽기, 쓰기 또는 둘 모두의 유형으로 설정해야한다.

Constant

Value

Description

QSocketNotifier::Read

0

There is data to be read.

QSocketNotifier::Write

1

Data can be written.

QSocketNotifier::Exception

2

An exception has occurred. We recommend against using this.

 

키보드 장치를 열고 파일 디스크립터 activated시그널과 readData슬롯을 연결한다. 이제 이 파일 디스크립터 활동이 감지되면 슬롯이 호출된다. 
KbdHandler *handler = new KbdHandler(&a);


if (handler->setFileDescriptor(open("/dev/input/event1", O_RDONLY | O_NONBLOCK, 0))) {
    qDebug() << handler->fileDescriptor();
    auto m_usbnotify = new QSocketNotifier(handler->fileDescriptor(), QSocketNotifier::Read);
    QObject::connect(m_usbnotify, SIGNAL(activated(int)), handler, SLOT(readData()));
}else{
    return -1;
}

.
.
.

// 사용이 끝나면 닫는 걸 잊지 않도록 한다.
close(handler->fileDescriptor());
delete handler;

 

Qt의 메인 이벤트 루프에서 검출되므로 별도의 이벤트 루프를 생성하지 않아도 된다.

번호 제목 글쓴이 날짜 조회 수
공지 Qt프로그래밍(QtQuick) Beginner를 위한 글 읽는 순서 운영자 2019.01.05 87600
119 안드로이드 가상장치 사용 file makersweb 2019.01.13 1178
118 QMake 프로젝트를 CMake 프로젝트로 변환 with qmake2cmake makersweb 2022.09.17 1185
117 Qml에서 커튼효과 구현 예제 - Shader Effects file 운영자 2018.12.05 1211
116 QProcess 예제 (프로그램 재시작) file makersweb 2023.01.25 1230
115 Qt 6의 비동기 API makersweb 2020.10.19 1314
114 많은 리소스를 사용하는 Qt프로젝트에서 고려해봐야 할 qmake 옵션 makersweb 2019.10.11 1318
113 Qt 하이브리드 애플리케이션(Hybrid App) 개발 file makersweb 2023.02.08 1324
112 재진입(Reentrancy) 및 스레드 안전성(Thread-Safety) makersweb 2020.04.19 1346
111 Qt 스마트 포인터 (QSharedPointer, QScopedPointer, QPointer) makersweb 2022.08.18 1362
110 웹기반 Qt Design Viewer [2] file makersweb 2019.10.23 1394
109 tslib의 ts_calibrate를 응용해서 Qt로 터치보정기능 구현 file makersweb 2019.04.06 1461
108 qInstallMessageHandler를 이용한 디버그 메세지 출력 제어하기 makersweb 2019.02.25 1467
107 QThread 및 QMutex 예제 makersweb 2021.01.12 1470
106 Qbs에 대한 소개와 설치하는 방법 makersweb 2019.10.09 1483
105 싱글터치 스크린 및 임베디드 리눅스 기반에서 Qt 터치입력 makersweb 2018.12.24 1508
104 QML과 JavaScript 의 숫자 관련 내장된 함수 makersweb 2021.03.28 1550
103 Qt Quick 3D 소개 makersweb 2019.11.09 1579
102 QML에서 undefined를 확인하는 방법 makersweb 2017.11.29 1601
101 ApplicationWindow 와 메뉴바(MenuBar)구성 file makersweb 2020.01.04 1608
100 Widgets(C++) 기반의 기본 스타일을 Dark 테마 및 Material 디자인 스타일로 바꾸기 file makersweb 2023.01.28 1628