我将使用 Qt 的 libcommuni 包装在另一个不使用 Qt 的 DLL 项目中。据我所知,我需要运行 Qt 消息泵(通过QCoreApplication)以确保网络、信号等正常工作。但是,我在弄清楚如何做到这一点时遇到了一些问题。
基本上,我想在 DLL 中启动一个线程,它调用QCoreApplication::exec()和泵送所有 Qt 事件。然后,我想将对位于不同线程上的 DLL 的外部调用编组到 Qt 主线程,这样我就可以安全地使用 libcommuni。
看起来推荐的方法是为此使用信号和插槽,但我一直无法让它工作。QObject我在通过 DLL 调用的类上创建了一个信号,并将其连接到QThread运行 Qt 消息泵的插槽。但是,如果我Qt::QueuedConnection在连接信号和插槽时指定,则在发出信号时永远不会传递消息。如果我完全省略Qt::QueuedConnection,插槽会立即在调用线程而不是 Qt 主线程上调用。
我还尝试显式调用QCoreApplication::postEvent()DLL 线程以将事件发送到 Qt 主线程,但event(QEvent)从未在 target 中调用QThread。
关于我在这里做错了什么的任何想法?我猜我不太了解 Qt 的线程模型。