Мне нужно интегрировать общую библиотеку QT с приложением без QT C++. Для обработки событий я вызываю функцию из библиотеки, которая запускает QCoreApplication, и необходимые объекты в отдельном QThread или std :: thread, оба работают. После запуска цикла события мне нужно вызвать созданные методы объекта из основного потока, чтобы получить некоторые данные из базы данных SQL, и по какой-то причине они не всегда работают. Этого никогда не происходит, когда я использую эти объекты в приложении QT, без потоковой передачи. Я могу отследить проблему до функции, но, к сожалению, это часть другой закрытой библиотеки. Есть ли у вас какие-либо предложения, что может пойти не так?Цикл событий QT в dll
ответ
Нативное приложение должно вращать собственный цикл событий в основном потоке. 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
сек, что раскручивать свои собственные циклы событий и делать все остальное, что нужно. Вы должны убедиться, что все объекты доступа к базе данных создаются в потоке, где они будут использоваться.
Мне нужно использовать приложение только в Windows, и оно должно быть простым приложением C++. Я «загрузил» цикл событий, а затем начал QThread, запускающий нужный объект, но сигналы/слоты не работают. –
Ок, извините, цикл событий работает в QThread, проблема в том, что я переопределял метод run. –