我必須將QT共享庫與非QT C++應用程序集成。 爲了處理事件,我從庫中調用一個函數,它啓動了QCoreApplication,並且在一個單獨的QThread或std :: thread中啓動了所需的對象,兩者都起作用。 事件循環啓動後,我需要從主線程調用創建的對象方法來從SQL數據庫獲取一些數據,並且由於某些原因,它們並不總是有效。 從來沒有發生過,當我在原生QT應用程序中使用這些對象時,沒有線程。 我可以將問題追蹤到函數,但不幸的是,這是另一個封閉庫的一部分。 你有什麼可以出錯的建議嗎?在一個DLL中的QT事件循環
1
A
回答
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
s表示旋轉自己的事件循環,做任何事,那就是必要的。你必須確保任何數據庫訪問對象都是在它們將被使用的線程中創建的。
相關問題
- 1. QT + OpenGL循環事件
- 2. Qt退出事件循環
- 3. 什麼是Qt中的事件循環?
- 4. qt中的libuv事件循環
- 5. 是Qt的事件循環是FIFO嗎?
- 6. Qt/C++事件循環異常處理
- 7. Python與Qt,事件循環工作
- 8. 創建qt線程事件循環
- 9. Qt事件循環和單元測試?
- 10. Qt庫事件循環問題
- 11. DLL中的Qt GUI環境(VST插件)
- 12. 在現有的非QT線程中創建QThread事件循環
- 13. 在Qt的while循環中等待clicked()事件
- 14. 在循環中做一件事
- 15. 的Qt :: QueuedConnection每個事件循環迭代
- 16. 輸出一個循環內的循環事件VBA
- 17. C++事件循環中的子應用程序的DLL
- 18. 如何在進入Qt事件循環後自動執行一個方法?
- 19. 請幫助循環一個JavaScript事件
- 20. 行爲循環的一個事務中
- 21. 在一個循環中的javascript onload事件
- 22. SDL:兩個事件循環?
- 23. 是一個CPU取/執行循環:「事件循環」
- 24. fileevent後在同一事件循環
- 25. Qt中禁用油嘴事件循環 - QT_NO_GLIB未生效
- 26. Qt QSound循環
- 27. 在jQuery中的循環綁定事件?
- 28. 事件在一個循環中停止觸發
- 29. UNUserNotificationCenter - 僅在for循環中安排一個事件,swift 2.3,iOS10,
- 30. C++ uWebSockets在一個線程中集成事件循環
我只需要在Windows上使用該應用程序,它應該是一個普通的C++應用程序。 我「啓動」了事件循環,然後啓動了運行所需對象的QThread,但信號/插槽不工作。 –
好的,對不起,事件循環在QThread中工作,問題是我重新實現了run方法。 –