C ++ 라이브러리 이벤트 루프의 기능을 제공하여 이벤트 중심 응용 프로그램을위한 즉각적이고 예약 된 이벤트를 처리합니다.
이벤트 루프는 이벤트가 이벤트를 처리하여 등록 된 수신기를 선택적으로 데이터로 알립니다.
이벤트 루프를 사용하여 이벤트 처리를 위해 현재 스레드를 차단하거나 다른 작업에 대해 현재 스레드를 무료로 남겨 두는 독립 스레드로
참고 : 이 라이브러리는 IPC 기능없이 동일한 프로세스 내에서 다중 스레드 이벤트 프로세스를위한 프레임 워크를 제공합니다.
EventLoop::Mode::BLOCK 이 이벤트 루프 모드는 EventLoop::Run() 호출이 발행 된 현재 스레드 (일반적으로 기본 스레드)를 차단합니다.
현재 스레드는 루프가 실행되는 한 이벤트를 계속 처리합니다.
EventLoop::Mode::NON_BLOCK 이 모드는 다른 스레드에서 이벤트 루프를 실행하여 EventLoop::Run() 호출이 차단되지 않은 상태에서 현재 스레드를 방지합니다.
이는 현재 스레드가 동일한 스레드에서 이벤트 루프를 시작한 후 일부 실행에 도달해야하거나 이미 자체 차단 이벤트 루프를 사용하는 경우 유용 할 수 있습니다. 후자의 예는 QT 프레임 워크의 QGuiApplication::exec() 호출 일 수 있습니다.
그것은 중요한 질문을 제기합니다. QT의 exec() 와 같은 1 차 이벤트 루프가 이미 존재할 때 2 차 이벤트 루프가 필요한 이유는 무엇입니까?
나는 당신에 대해 잘 모르지만 QT 이벤트 루프에서 등록/구독 한 모든 수신기에게 신호를 방송하는 기능과 같은 일부 기능을 놓쳤습니다. 이것은 사물이 어떻게 작동하는지에 대한 호기심과 개념을위한 가려움증에 대한 호기심과 같은 다른 사람들 외에도 처음부터 이벤트 루프 라이브러리를 개발하기위한 주요 동기였습니다!
방송은 응용 프로그램의 여러 구성 요소가 각 수신기를 발신자 설명과 연결하지 않고 단일 자극에 작용하기를 원할 때 전형적인 상태입니다. QT에서 방송 수신을 활성화하기 위해 발신자 인스턴스를 여러 리시버에게 전달하고 각각에 대한 신호 슬롯 연결을 생성합니다!
또 다른 확실한 이유는 이벤트를 등록하고 트리거하기 위해 이벤트 제공 업체 또는 관련 발신자 및 수신자 객체에 대한 참조없이 전체 응용 프로그램에 대한 글로벌 이벤트 처리 시스템을 작성하는 것이 었습니다. EventLoop 은 정적 메소드가있는 독립형 정적 클래스로, 개발자는 QT와 달리 QT와 수신기 개체의 핸들이 연결 및 방출 신호를 방출하는 데 필요한 QT와 달리 Code와 달리 절대적으로 모든 스레드에서 API 호출을 발행 할 수 있습니다.
사용자는 이벤트 루프 라이브러리를 응용 프로그램에 동적으로 연결하고 응용 프로그램 코드에 EventLoop.h 헤더를 포함하여 라이브러리 메소드에 액세스 할 수 있습니다. 이름과 데이터로 이벤트를 전달하고 받기 위해 Event 사용자 정의 유형으로 사용하고 있기 때문에 Event.h 가 이벤트에서 해당 세부 정보를 가져 오는 소스 파일에 필요한 이벤트가 필요합니다.
참고 : 응용 프로그램에서 라이브러리를 사용할 때 위에서 언급 한 것 외에이 프로젝트의 포함 디렉토리의 다른 헤더는 포함하지 마십시오. 기억하는 또 다른 방법은 앱의
.h헤더 파일 만 필요하며 모든.hpp파일을 무시할 수 있다는 것입니다.
자세한 API 문서는 EventLoop.h 헤더에서 찾을 수 있습니다. 다음 단계는 응용 프로그램에서 이벤트 루프 사용 가능성을 보여줍니다.
main() 함수에서 루프가 블로킹하지 않으려면 EventLoop::SetMode() 메소드를 호출하십시오. 기본 모드이기 때문에 차단 모드를 위해 이것을 명시 적으로 호출 할 필요가 없습니다.main() 의 EventLoop::Run() 메소드를 호출합니다.EventLoop::RegisterEvent() 가있는 클래스 또는 소스 파일에서 Event* 수락 이벤트를 수락하는 콜백 등록. 일반적으로 등록은 Lambdas 또는 클래스 멤버 기능을 가진 클래스 생성자에서 수행됩니다.EventLoop::TriggerEvent() 가있는 응용 프로그램 스레드에서 언제든지 이벤트를 트리거하고 특정 이벤트 이름에 등록 된 해당 핸들러는 사용 된 과부하 유형에 따라 즉각적으로 또는 시간 초과 후에 호출됩니다.Event 유형의 Event::getName() 및 Event::getData() 메서드EventLoop::Halt() 메소드의 명시적인 호출을 통해 이벤트 루프가 우아하게 종료 할 수 있습니다. 이 메소드는 어느 모드에서든 모든 스레드에서 호출 할 수 있습니다. 등록 된 핸들러 내부에서 호출되면 핸들러 스코프 완료시에만 적용됩니다.팁 : QT의
exec()이벤트 루프 상단에서EventLoop사용하려는 경우QGuiApplication::aboutToQuit에서exec()호출 및EventLoop::Halt()호출하기 전에 비 블로킹EventLoop::Run()()을 설정하십시오.
QObject::connect(&app, &QGuiApplication::aboutToQuit, []{ EventLoop::Halt(); });
참고 :
EventLoop::Run()EventLoop::Run()디자인별로 이벤트를 처리하기 위해 현재 스레드를 차단하기 때문에 이벤트 루프가 중단 될 때까지 동일한 스레드에서 CALL을 차단 한 후 모든 코드가 이벤트 루프가 중단 될 때까지 실행되지 않습니다.
쇼핑 카트 앱은이 라이브러리 및 API의 사용 참조 역할을합니다. 질문이나 설명이 있으면 [email protected]으로 연락 할 수 있습니다.
Releases 에서 라이브러리의 최신 안정적인 릴리스를 확인하지만 현재 소스 코드 버전으로 소스에서 라이브러리를 빌드하려면 build.sh 스크립트를 실행하십시오.
옵션없이 스크립트를 실행할 수 있습니다. 각 옵션의 기본값은 사용 지침의 {} 에 나타납니다. 다음 명령을 실행하여 스크립트 사용법에 대해 알아보십시오.
./build.sh -h
예를 들어, Unix Makefiles Cmake 생성기를 사용하여 스크립트를 사용하여 릴리스 모드를 위해 빌드하려면 다음과 같이 스크립트를 실행할 수 있습니다.
./build.sh -a -r -g "Unix Makefiles"
빌드 아티팩트는 build 디렉토리에서 생성됩니다
출력 아티팩트는 lib 디렉토리에 libEventLoop.so 으로 표시됩니다. 따라서 대상 대상으로 추가로 연결하거나 이동할 수 있습니다.
생각하면 프로젝트에 기여할 수 있습니다.
잠재적 인 기여자로서 당신은 할 수 있습니다
질문이나 제안이 있으시면 나와 연락하십시오 [email protected]