8

関数にイベントループを持たないプログラムの上QTcpServerに構築されたライブラリを作成したいと思います (Qt イベントループがブロックされており、必要なリアルタイム操作に十分なタイミング解像度が提供されないため) )。QTcpSocketmain

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

私はすでに見ましたQApplication::exec() なしで Qt を使用する方法はありますか? しかし、ソリューションはローカル イベント ループを追加するように見えますが、アプリケーション ループは削除しないため、答えは役に立ちません。

4

1 に答える 1

9

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

于 2015-01-06T15:20:56.650 に答える