2010-05-09 4 views
10

주 (메인 프레임에 액세스 할 권한이 없기 때문에 내 GUI는 동적으로로드 및 언로드 할 수있는 플러그인이어야 함)의 QApplication을 exec()해야합니다. . 누군가가 QApplication을 메인 외부에서 시작하는 것에 대한 Qt의 제한을 해킹 할 수있는 (상대적으로) 고통없는 방법을 알고 있습니까?QApplication Non-Main Thread

저는 gcc4.3.4를 사용하여 C++에서 Qt4를 사용하여 Linux에서 개발 중입니다.

답변

4

QThread를 사용하는 경우 이미 일반적인 Qt 이벤트 루프가 있으며 QThread :: run() 함수 내에서 exec()를 실행할 수 있습니다. 주 스레드 외부의 GUI 개체로 작업 할 수는 없지만 대기중인 신호/슬롯 연결을 통해 여전히 상호 작용할 수 있습니다. 어쩌면 주 스레드 QThread 개체에 대한 포인터를 저장하고 QApplication을 다른 스레드로 이동하는 대신 QObject :: moveToThread()를 호출하여 GUI 개체를 주 스레드로 옮길 수 있습니다.

나는 다른 종류의 해킹과 kluges로 툴킷에 반대하는 것이 좋지 않다고 생각합니다.

+0

당신이 맞을지도 모른다고 생각합니다. VestniK - 실제로 GUI가 실행되는 동안 OS가 강제로 다른 GUI를 드래그하여 GUI를 다시 그리지 않으면 실제로 update() 호출을 서비스하지 않는 것 같습니다. – rcv

+0

이 대답은 다른 문제를 해결하는 데 유용하지만 QMainWindow 객체를 다른 스레드에서 주 스레드로 이동하는 동안 QObject :: moveToThread를 받았다 : 위젯을 새 스레드로 이동할 수 없음 – ASten

1

패치 Qt, 나는 메인 스레드 체크를 추측하고 제거하고, 그것이 당신을 위해 작동하는지 테스트한다. OSX/Cocoa에서 작동하지 않는 http://bugreports.qt-project.org/browse/QTBUG-7393 에 따르면 Cocoa는 첫 번째 스레드가 메인/UI 스레드로 스폰되는 것으로 가정합니다.

1

좋아, 나는 작동하는 것을 얻었다! 그것은 꽤 아니지만, 확실히 그 일을합니다.

  1. 만들기) (> this-를 호출하는 클래스를 쇼를이 클래스의 이벤트() 함수를 거기에 실제 GUI의 모든 코드와 QMainWindow 유도체를 생성하고 과부하 (현실을 부르 자 Runner)는 QMainWindow 파생 상품에 대한 포인터를 보유하고 실행 기능을 제공합니다. 주자 :: 러너()에서

  2. (지금의 자신의 스레드에서 실행되는) 주자를 호출 스레드 : : 실행()

    러너에서
  3. :: 실행() 시작 구성 QApplication 및 QMainWindow 파생 상품의 인스턴스화에 대해 설명합니다. QApplication의 exec() 함수를 호출하십시오.

  4. 이제 GUI를 시작하고 QMainWindow 파생 상품에 이벤트를 게시하면 그 자체가 표시됩니다!

이 솔루션은 실제로 Linux에서 잘 작동하는 것처럼 보이지만, Qt에서 약간의 허점을 이용하고있는 것으로 보이며 다른 플랫폼에서는 작동하지 않을 수 있습니다. Qt를 패치하는 것보다 확실히 쉽습니다.

+0

안녕하세요 Boatzart, 나는 똑같은 것을 이루려고 노력하고 있습니다. "Runner :: Runner(), Runner :: run()"을 호출 할 스레드를 시작하면 무슨 뜻입니까?Runner thread를 시작할 다른 QThread를 시작 하시겠습니까? 하지만 QApplication을 구축하지 않고 어떻게 다른 스레드를 시작할 수 있습니까? – blueskin

8

당신은 같은 pthread와에서의 QApplication을 시작할 수 있습니다 //appthread.cpp

#include <iostream> 
#include "appthread.h" 
int main(int argc, char *argv[]) { 
    InputArgs args = {argc, argv}; 
    StartAppThread(args); 
    sleep(10); 
    return 0; 
} 

//appthread.h

struct InputArgs{ 
    int argc; 
    char **argv; 
}; 
void StartAppThread(InputArgs &); 

//main.cpp

아래
#include <QApplication> 
#include <QMainWindow> 
#include <QPushButton> 
#include "appthread.h" 
#include <pthread.h> 

void *StartQAppThread(void *threadArg) { 
    InputArgs *args = (struct InputArgs*) threadArg; 
    QApplication app(args->argc, args->argv); 
    QMainWindow w; 
    w.show(); 
    w.setCentralWidget(new QPushButton("NewButton")); 
    app.exec(); 
    pthread_exit(NULL); 
} 

void StartAppThread(InputArgs &args) { 
    pthread_t thread1; 
    int rc = pthread_create(&thread1, NULL, StartQAppThread, (void*)&args); 
}