Можно ли создавать локальные циклы событий без вызова QApplication::exec()?

Я хотел бы создать библиотеку на основе QTcpServer а также QTcpSocket для использования в программах, в которых нет циклов событий main функции (потому что цикл событий Qt блокируется и не обеспечивает достаточного временного разрешения для требуемых операций в реальном времени).

Я надеялся обойти это, создавая локальные циклы событий внутри класса, но, кажется, они не работают, если я не позвонил app->exec() в основной функции первым. Есть ли какой-нибудь способ создания локальных циклов событий и обеспечения связи сигнал / слот в потоке без цикла событий уровня приложения?

Я уже посмотрел Есть ли способ использовать Qt без QApplication::exec()? но ответ не помогает, потому что кажется, что решение добавляет цикл локальных событий, но не удаляет цикл приложения.

1 ответ

Решение

Вы можете создать экземпляр QCoreApplication в новой теме в библиотеке. Вы должны проверить, чтобы создать только один экземпляр этого, потому что каждое приложение Qt должно содержать только один 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-приложениях.

Другие вопросы по тегам