【问题标题】:Qt add function call to event loop from other threadQt从其他线程添加函数调用到事件循环
【发布时间】:2014-11-11 22:55:20
【问题描述】:

我偶然发现了一个我现在无法以优雅的方式解决的问题。 情况:我有一个从我的应用程序外部调用的回调函数。回调函数必须更新一些 gui 对象。由于我不能从另一个线程中调用(例如)repaint(),我必须找到一些方法来向主事件循环添加函数调用,以便执行任务在某个时候。

一种可能的方法是使用它:

QMetaObject::invokeMethod(object, "functionName", Qt::QueuedConnection, Q_ARG(float, value)); 

但是,这只是给了我no such Method "Object::functionName" 的响应。 (这显然是一个谎言!)

我还阅读了有关通过将连接类型设置为Qt::QueuedConnection 将信号连接到将从事件循环中调用的槽的信息。但是,使用QOjbect.:connect() 将不起作用,因为我不知道信号需要获取哪个对象。不错会是这样的

QObject::emit(object, SIGNAL(function(flaot)), arg);

【问题讨论】:

  • 通常QMetaObject::invokeMethod 工作正常。它也不会说谎,如果您的调用中有错字,它将失败(因为它是在运行时评估的 - 没有编译器检查函数是否存在)并输出该消息。检查你的电话,它应该可以工作

标签: c++ multithreading qt signals qeventloop


【解决方案1】:

QMetaObject::invokeMethod 通常是您在这种情况下应该使用的。确保:

  • object 是 QObject 子类,顶部有 Q_OBJECT 宏
  • functionName 要么在插槽部分中声明,要么具有 Q_INVOKABLE 宏

【讨论】:

  • 嗨,将其声明为插槽有帮助。不知何故错过了这一点。谢谢!没有“更快”的方式吗?该应用程序非常注重性能(实时音频等),我想尽可能节省 CPU 时间。 :)
  • 我不知道,AFAIK 发布自定义 QEvent 或使用 0ms QBasicTimer 不可能跨线程。 InvokeMethod 有相当大的开销,所以我过去一直依赖的是将调用批处理成尽可能少的消息,在那里我处理由 QMutex 或 QSemaphore 保护的所有累积数据。
猜你喜欢
  • 2013-05-24
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 2019-01-12
相关资源
最近更新 更多