QT4 또는 GTK와 같은 GUI 프레임 워크에서 BOOST.ASIO 메인 루프를 통합하는 방법

StackOverflow https://stackoverflow.com/questions/1001032

문제

boost.asio를 QT4 (선호) 또는 GTK 기본 루프와 통합하는 방법이 있습니까? GTK는 API와 같은 여론 조사를 제공하므로 기술적으로 가능해야합니다. QT는 자체 네트워킹 계층을 제공하지만 boost.asio를 위해 작성된 기존 코드를 사용하는 것이 좋습니다. 통합하고 싶습니다 없이 추가 스레드 사용.

QT4 (선호) 또는 GTKMM에 대해이 작업을 수행하는 방법이 있습니까?

감사.

편집하다

답을 더 쉽게 만들기 위해 몇 가지 사항을 확인하고 싶습니다. QT와 GTKMM은 "SELECT LIKE"기능을 제공합니다.

따라서 문제는 기존 "선택기/폴러"를 부스트의 원자로로 통합하는 방법입니다. io_service. 오늘날 Boost.asio는 Select, Kqueue, epoll,/dev/poll 및 iocp를 원자로/proactor 서비스로 사용할 수 있습니다. GUI 프레임 워크의 메인 루프에 통합하고 싶습니다.

모든 제안과 솔루션 (더 나은)을 환영합니다.

도움이 되었습니까?

해결책

다소 오래된 질문이지만 지금 그것을 읽고있는 사람들에게는 공유하고 싶습니다 내 코드 이것은 boost :: asio를위한 QabstracteventDispatcher의 구현입니다.

Qapplication을 만들기 전에 다음 줄을 추가하는 것입니다 (일반적으로 main ()에 있습니다).

QApplication::setEventDispatcher(new QAsioEventDispatcher(my_io_service));

IO_Service가 추가 대기 시간 및 성능 강하없이 한 스레드의 QT 응용 프로그램과 함께 실행되고 있습니다 (IO_Service :: poll ()을 호출하는 솔루션에서와 같이 "때때로").

불행히도, 내 솔루션은 asio :: posix :: stream_descriptor를 사용하기 때문에 posix 시스템만을위한 것입니다. Windows 지원은 완전히 다른 접근 방식이 필요하거나 매우 유사 할 수 있습니다.

다른 팁

단순한:호출되는 QT 슬롯을 작성하십시오 io_service::poll_one() GUI에 속합니다. 해당 슬롯을 QT에 연결하십시오 tick 신호.

깊이 :운 좋게도 부스트. 아시오는 매우 잘 설계되었습니다. 기본 비동기 내부에 실행 스레드를 제공하는 방법에는 많은 옵션이 있습니다. 사람들은 이미 사용을 언급했습니다 io_service::run(), 많은 단점이있는 차단 호출.

단일 스레드에서 GUI 위젯에만 액세스 할 수 있습니다. 외부 스레드는 일반적으로 위젯을 돌연변이하려면 GUI에 이벤트를 게시해야합니다. 이것은 ASIO의 작동 방식과 매우 유사합니다.

순진한 접근 방식은 하나의 스레드 (또는 타이머)를 실행에 전념하는 것입니다. io_service::run() ASIO 완료 처리기가 GUI 신호를 게시하도록합니다. 이것 ~ 할 것이다 일하다.

대신 완료 핸들러가 io_service 방문객. GUI 스레드 호출이 없습니다 io_service::run() 그것이 막히고 GUI를 걸 수 있습니다. 대신 사용하십시오 io_service::poll() 또는 io_service::poll_one(). 이로 인해 GUI 스레드에서 보류중인 ASIO 완료 처리기가 호출됩니다. 핸들러는 GUI 스레드에서 실행되므로 위젯을 자유롭게 수정할 수 있습니다.

이제 당신은 확인해야합니다 io_service 정기적으로 달릴 기회를 얻습니다. 반복되는 GUI 신호 호출을 권장합니다 poll_one() 몇 번. 나는 QT가 트릭을 수행 할 진드기 신호를 가지고 있다고 생각합니다. 물론 더 많은 제어를 위해 자신의 QT 신호를 굴릴 수 있습니다.

귀하의 질문을 올바르게 이해하면 Boost.asio를 위해 코드를 작성했습니다. GUI 애플리케이션 내에서 해당 코드를 사용하고 싶습니다.

질문에서 명확하지 않은 것은 GUI 이벤트 루프와 Asynio를 함께 갖는 솔루션을 찾고 있다면 코드가 작동하기 위해 asynio를 통해 QT/GTK 네트워크 레이어를 랩핑하려는 경우입니다.

두 번째 사례를 가정하겠습니다.

QT와 GTK는 모두 이벤트 루프에서 외국 이벤트를 통합하는 방법이 있습니다. 예를 들어 참조하십시오 qtgtk QT 이벤트 루프가 GTK에 연결된 위치.

QT의 특정 사례에서 QT에 대한 이벤트를 생성하려면 다음 클래스를 사용할 수 있습니다. QABSTRANTEVENTDISPATCHER.

Boost Asio를 간단히 살펴본 후 다음을 수행해야한다고 생각합니다.

  • 항상 io_service :: run ()을 호출하는 시간 제로가있는 반복 QTIMER가 있어야합니다. 이렇게하면 Boost :: Asio는 비동기 작업이 완료 되 자마자 완료 핸들러를 호출합니다.
  • 완료 핸들러에서 두 가지 옵션 :
    • 완료 작업이 긴 운영 인 경우 GUI와 분리 된 작업이 긴 경우 사업을 수행하고 GUI 응답을 유지하려면 QAPP.Processevents ()에게 전화하십시오.
    • GUI와 다시 의사 소통하고 싶다면 :
      1. 관습을 정의하십시오 QEVENT 유형
      2. 이 이벤트를 구독하십시오
      3. 이벤트를 사용하여 이벤트를 QT 이벤트 루프에 게시하십시오 qcoreapplication :: postevent ().

메인 루프를 진정으로 통합합니다 ~이다 가능한. 그것은 단지 큰 고통입니다 (그리고 나는 아직 그것을 시도하지 않았습니다).

별도의 스레드에서 io_service :: run ()을 실행하는 것은 아마도 갈 길입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top