2015-01-06 10 views
5

main 함수에 이벤트 루프가없는 프로그램에서 사용하기 위해 QTcpServerQTcpSocket 위에 빌드 된 라이브러리를 만들고 싶습니다 (Qt 이벤트 루프가 차단되어 있고 실시간 작업 필요).QApplication :: exec()를 호출하지 않고 로컬 이벤트 루프를 만들 수 있습니까?

클래스 내에서 로컬 이벤트 루프를 작성하여이 문제를 해결하고 싶지만 메인 기능에서 app->exec()을 먼저 호출하지 않으면 작동하지 않는 것 같습니다. 로컬 이벤트 루프를 만들고 응용 프로그램 수준 이벤트 루프가 없어도 스레드 내에서 신호/슬롯 통신을 허용하는 방법이 있습니까?

나는 이미 Is there a way to use Qt without QApplication::exec()?을 보았지만 해결책은 로컬 이벤트 루프를 추가하지만 응용 프로그램 루프를 제거하지 않는 것처럼 보이기 때문에 도움이되지 않습니다.

+0

'QApplication :: exec()'을 가진 새로운 스레드를 생성하고 그것을 "메인 스레드"로 유지 하시겠습니까? –

+0

나는 그것에게 시험을 줄 것이다. 유일한 단점은 비록 실제로 QttlApplication :: Exec'을 두 번 호출 할 수 없으므로 실제 Qt 응용 프로그램과 함께 라이브러리를 사용하지 못하게 할 것입니다. –

답변

6

QCoreApplication의 인스턴스를 라이브러리의 새 스레드에 만들 수 있습니다. 각 Qt는 응용 프로그램이 하나의 QCoreApplication를 포함해야하기 때문에 그건, 그것의 단 하나의 인스턴스를 만들 확인해야합니다 : 당신이 당신의 Qt를 사용할 수 있습니다

class Q_DECL_EXPORT SharedLibrary :public QObject  
{ 
Q_OBJECT 
public: 
    SharedLibrary(); 

private slots: 

    void onStarted(); 

private: 
    static int argc = 1; 
    static char * argv[] = {"SharedLibrary", NULL}; 
    static QCoreApplication * app = NULL; 
    static QThread * thread = NULL; 
}; 


SharedLibrary::SharedLibrary() 
{ 
    if (thread == NULL) 
    { 
     thread = new QThread(); 
     connect(thread, SIGNAL(started()), this, SLOT(onStarted()), Qt::DirectConnection); 
     thread->start(); 
    } 
} 
SharedLibrary::onStarted() 
{ 
    if (QCoreApplication::instance() == NULL) 
    { 
     app = new QCoreApplication(argc, argv); 
     app->exec(); 
    } 
} 

이 방법도 비 Qt는 응용 프로그램에서 공유 라이브러리.

+1

그리고 아마도 루프 검사 및 시작시 동기화 할 수 있습니다. –

+2

이것은 QCoreApplication :: instance()의 체크에 +1이 더 필요합니다. –

+0

@NicolasHolthaus 좋은 지적입니다. 내가 너 한테 해 줬어. – Tay2510