Мне нужно интегрировать общую библиотеку 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
сек, что раскручивать свои собственные циклы событий и делать все остальное, что нужно. Вы должны убедиться, что все объекты доступа к базе данных создаются в потоке, где они будут использоваться.
- 1. Цикл заблокированных событий Qt
- 2. Что такое цикл событий в Qt?
- 3. Цикл событий Qt и модульное тестирование?
- 4. Qt: цикл событий во время закрытия
- 5. Python, работающий с Qt, цикл событий
- 6. Почему цикл обработки событий Qt покинул
- 7. Qt using .dll в .dll
- 8. Qt: Multi-Threaded DLL Design
- 9. Qt добавить вызов функции в цикл событий из другого потока
- 10. Импорт .dll в Qt
- 11. Qt - Диалог в DLL
- 12. Очередь событий в Qt
- 13. Обработчики событий в Qt
- 14. испускать сигнал Qt из не-Qt Thread или ouside Основной цикл событий Qt с 4.5
- 15. Цикл событий в java
- 16. Очередь глобального события, если цикл событий Qt 5 приостановлен
- 17. Qt Console Application: while loop блокирует цикл событий
- 18. Qt :: QueuedConnection вызвать максимум один раз за цикл событий итерации
- 19. Ungraceful/kill приложение Qt, когда цикл событий не запущен
- 20. Где работает цикл событий PyQt?
- 21. с использованием Qt dll в MFC
- 22. DLL-файлы Qt-приложений с DLL-файлами QT Creator
- 23. Смущает система циклов событий Qt?
- 24. Qt Release DLL Error
- 25. Kernel32.dll отсутствует в QT
- 26. Задержка загрузки DLL в QT
- 27. использовать dll в qt creator
- 28. Использование Qt-DLL в Python
- 29. Использование сетевого модуля Qt в плагине (DLL)?
- 30. Слоты Qt не выполняются в многопоточной DLL
Мне нужно использовать приложение только в Windows, и оно должно быть простым приложением C++. Я «загрузил» цикл событий, а затем начал QThread, запускающий нужный объект, но сигналы/слоты не работают. –
Ок, извините, цикл событий работает в QThread, проблема в том, что я переопределял метод run. –