2012-11-11 2 views
0

Qt-4.8.3을 사용하기 위해 사용자 인터페이스를 확장하고 사용할 수있는 CLI 애플리케이션이 있습니다.Qt4 UI 스레드와의 인터페이스

응용 프로그램이 IRC 서버에 연결되고 각 연결이 자체 스레드에서 데이터를 수신하여 상주합니다. 다른 스레드에서 실행중인 파서가 데이터를 처리하고 이에 따라 반응합니다. 채널을 만들고 사용자를 추가하는 등의 작업을 수행합니다.

저는 설명서를 살펴본 결과, 내 인스턴스에서 UI를 업데이트하는 가장 유용한 방법은 무엇입니까? QThread를 상속 한 클래스를 만들어 실행하고 QFuture 및 QtConcurrent를 사용하여 속임수를 쓰고 사용자 정의 구조체를 만들고이를 UI 스레드에 채우고 customEvent() 또는 전체적으로 더 좋은 방법이 있습니까? 코드의 가독성 및 성능은 최고의 요구 사항입니다.

내가 지금 가지고있는 코드는 완벽하게 실행되지만 자연스럽게 파서 스레드 안에 새로운 QWidget을 생성하면 UI 스레드가 아니라는 알림이 즉시 나옵니다.

QApplication에서 exec를 실행하는 데 사용하는 단일 클래스 (현재 QObject를 상속하고 신호 + 슬롯 기능 제공)뿐 아니라 서버, 채널, 사용자에 대한 작성 기능도 보유합니다 등등.

필자는 필요한 경우 몇 가지 코드를 게시 할 수 있지만 그 중 많은 부분이 있으며 실제로 관련성이 있는지는 잘 모르겠습니다.

답변

4

이 작업을 수행하는 표준 방법은 QObject/QThread 쌍 (또는 여러 스레드가 동일한 스레드에서 실행되도록하려면 여러 QObject 및 단일 QThread를 생성하는 것입니다.) QThread를 서브 클래 싱하는 대신 QObject를 하위 클래스로 만들고 QThread를 실행하고 QObject 하위 클래스 인스턴스를 moveToThread()으로 해당 스레드로 이동하십시오. QThread의 의도 된 용도는 운영 체제의 스레딩 기능에 대한 인터페이스로서 코드를 실행하는 컨테이너가 아닙니다. (http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation 참조).

GUI와의 모든 통신은 물론 신호와 슬롯을 사용하여 발생해야합니다.

+0

우수한 링크를 통해 테스트 과정에서 이상한 점을 알 수 있습니다. – ZXcvbnM

0

이 상황은 꽤 흔하게 들립니다. UI 업데이트를 위해 처리 된 데이터를 스레드에서 메인 스레드로 전달하는 기본적인 솔루션 일뿐입니다.

가장 쉬운 방법은 SIGNAL/SLOT 메커니즘을 사용하는 것입니다. 주 스레드는 파서의 신호에 연결되어야합니다. 파서에서 데이터가 준비되면 사용하기로 선택한 데이터 구조로 신호를 내 보내면됩니다. 데이터 구조는 단순히 데이터 통신에 대한 필요성에 관계없이 간단합니다. 그냥 구조체 또는 원하는대로.