2017-02-17 46 views
1

我必須將QT共享庫與非QT C++應用程序集成。 爲了處理事件,我從庫中調用一個函數,它啓動了QCoreApplication,並且在一個單獨的QThread或std :: thread中啓動了所需的對象,兩者都起作用。 事件循環啓動後,我需要從主線程調用創建的對象方法來從SQL數據庫獲取一些數據,並且由於某些原因,它們並不總是有效。 從來沒有發生過,當我在原生QT應用程序中使用這些對象時,沒有線程。 我可以將問題追蹤到函數,但不幸的是,這是另一個封閉庫的一部分。 你有什麼可以出錯的建議嗎?在一個DLL中的QT事件循環

回答

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表示旋轉自己的事件循環,做任何事,那就是必要的。你必須確保任何數據庫訪問對象都是在它們將被使用的線程中創建的。

+0

我只需要在Windows上使用該應用程序,它應該是一個普通的C++應用程序。 我「啓動」了事件循環,然後啓動了運行所需對象的QThread,但信號/插槽不工作。 –

+0

好的,對不起,事件循環在QThread中工作,問題是我重新實現了run方法。 –