我将使用 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 的线程模型。