一个DLL中的QT事件循环

时间:2017-02-17 15:32:51

标签: c++ multithreading qt

我必须将QT共享库与非QT c ++应用程序集成。 为了处理事件,我从库中调用一个函数,该函数启动QCoreApplication,并在单独的QThread或std :: thread中调用所需的对象。 在事件循环开始之后,我需要从主线程调用创建的对象方法从SQL数据库中获取一些数据,并且出于某种原因,它们并不总是有效。 当我在本机QT应用程序中使用这些对象而没有线程时,这种情况从未发生过。 我可以将问题跟踪到函数,但不幸的是,这是另一个封闭库的一部分。 你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

本机应用程序应该在主线程中旋转本机事件循环。 Qt在大多数平台上使用本机事件循环,因此您不必使用QCoreApplication::exec()并阻止其发送事件。相反,要有一个像样的跨平台主线程事件循环集成只是" prime"让它旋转一次的事件循环。这可以确保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,并执行其他所需的操作。您必须确保在将要使用它们的线程中创建任何数据库访问对象。