2017-02-17 12 views
1

Мне нужно интегрировать общую библиотеку QT с приложением без QT C++. Для обработки событий я вызываю функцию из библиотеки, которая запускает QCoreApplication, и необходимые объекты в отдельном QThread или std :: thread, оба работают. После запуска цикла события мне нужно вызвать созданные методы объекта из основного потока, чтобы получить некоторые данные из базы данных SQL, и по какой-то причине они не всегда работают. Этого никогда не происходит, когда я использую эти объекты в приложении QT, без потоковой передачи. Я могу отследить проблему до функции, но, к сожалению, это часть другой закрытой библиотеки. Есть ли у вас какие-либо предложения, что может пойти не так?Цикл событий QT в dll

ответ

1

Нативное приложение должно вращать собственный цикл событий в основном потоке. Qt использует собственный цикл событий на большинстве платформ, поэтому вам не нужно использовать QCoreApplication::exec() и блокировать его для отправки событий. Вместо этого, чтобы иметь приличную кросс-платформенную интеграцию цикла событий основного потока, просто «запустите» цикл событий, позволяя ему вращаться один раз. Это гарантирует, что Qt готов к отправке своих событий тем, кто запускает собственный цикл событий в данном потоке (здесь: основной поток).

Это не переносимый экземпляр QApplication на любую тему, кроме основной темы. Случается, что он работает в Windows, но он вообще не работает на OS X, и работает ли он на X11, зависит от точной реализации платформы, с которой вы интегрируетесь.

static std::unique_ptr<QApplication> app; 
static int argc{1}; 
static const char * argv[] = { "myLibrary", nullptr }; 

void myLibraryInit() { 
    app.reset(new QApplication{argc, argv}); 
    QMetaObject::invokeMethod(qApp, "quit", Qt::QueuedConnection); 
    app.exec(); 
} 

void myLibraryDeInit() { 
    app.reset(); 
} 

В этот момент, вы свободны, чтобы начать какие-либо QThread сек, что раскручивать свои собственные циклы событий и делать все остальное, что нужно. Вы должны убедиться, что все объекты доступа к базе данных создаются в потоке, где они будут использоваться.

+0

Мне нужно использовать приложение только в Windows, и оно должно быть простым приложением C++. Я «загрузил» цикл событий, а затем начал QThread, запускающий нужный объект, но сигналы/слоты не работают. –

+0

Ок, извините, цикл событий работает в QThread, проблема в том, что я переопределял метод run. –

 Смежные вопросы

  • Нет связанных вопросов^_^