Eng*_*999 5 c++ user-interface qt multithreading callback
我正在使用 Qt 开发一个应用程序,我想通过另一个不相关的类更新我的 GUI,并在不同的线程中执行函数。
我使用标准 C++ 构造 std::function 和 std::bind 将回调函数从 Qt GUI 类注册到另一个类。
在尝试从其他类执行 GUI 回调函数时,我的程序崩溃并显示“ qt 无法将事件发送到不同线程拥有的对象”。
我的问题是,这里究竟发生了什么。为什么不允许这样两个线程之间进行通信。是否可以通过某种方式解决这个问题,或者Qt只是不允许其他不相关的功能以这种方式更新GUI?
有关信息,我正在 Windows 上使用 portaudio 库。它在不同的线程中执行回调。当我收到音频时,我尝试更新我的 GUI。
先感谢您
您可能对“发送事件”这个短语感到困惑。在 Qt 中,这句话具有严格的技术含义。即:
发送事件意味着使用,然后立即在接收器上调用。当发送和接收线程不同时发送事件是错误的。QCoreApplication::sendEventQObject::event
发布事件意味着使用,它将事件发布到接收对象线程的事件队列。QCoreApplication::postEvent接收QObject::event器上的 稍后由接收器线程的事件循环调用。
当对象存在于不同的线程中时,您不允许发送事件,只能发布它们。这指出了您的问题的根本原因/
您在一个类或派生类上访问的任何方法都必须在其(即主线程)QWidget上访问。thread()内部的所有内容都QWidget可以sendEvent自由使用,因为发送线程和接收对象的线程在约定上是相同的。QWidget通过从错误的线程调用方法,您会通过间接使用来破坏该契约sendEvent,从而失败。
只有您自己实现的并且线程安全的方法才能从其他线程调用 - 并且它们不能使用sendEvent.
| 归档时间: |
|
| 查看次数: |
10386 次 |
| 最近记录: |