2015-01-06 6 views
5

main関数でイベントループを持たないプログラムで使用するために、QTcpServerQTcpSocketの上に構築されたライブラリを作成したいとします(Qtイベントループがブロックされていて、リアルタイム操作が必要)。QApplication :: exec()を呼び出さずにローカルイベントループを作成することはできますか?

私は、このクラス内でローカルイベントループを作成することでこの問題を回避したいと考えていましたが、最初にapp->exec()を呼び出さなければ機能しません。ローカルイベントループを作成し、アプリケーションレベルのイベントループを持たずにスレッド内で信号/スロット通信を可能にする方法はありますか?

私は既にIs there a way to use Qt without QApplication::exec()?を見てきましたが、解決策はローカルイベントループを追加するがアプリケーションループを削除しないように思われるため、答えは役に立たない。

+0

'QApplication :: exec()'を持つ新しいスレッドを生成し、それを "メインスレッド"として生き続けますか? –

+0

私はそれを試してみましょう。唯一の欠点は、たとえ実際には実際のQtアプリケーションでライブラリを使用することができなくても、おそらくQApplication :: execの2つの呼び出しを持つことができないからです。 –

答えて

6

QCoreApplicationのインスタンスをライブラリの新しいスレッドに作成できます。

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アプリケーションであなたのQt共有ライブラリを使用することができます。この方法は:あなたは、各Qtアプリケーションが一つだけQCoreApplicationが含まれている必要がありますので、それはだ、それのインスタンスを1つだけ作成するためにチェックする必要があります。

+1

とループのチェックと起動を同期させることができます –

+2

これは、QCoreApplication :: instance()のチェックのために余分な+1が必要です –

+0

@NicolasHolthaus良い点。私はあなたのためにそれをしました。 – Tay2510

関連する問題