我所拥有的这两个调用是另一个线程中另一个对象中的方法。
QMetaObject::invokeMethod(object, "method", Qt::variousOptionalParameters,
Q_ARG(int, a), Q_ARG(int, b), Q_ARG(float, c), Q_ARG(QString, d));
Run Code Online (Sandbox Code Playgroud)
和
object->method(a, b, c, d);
Run Code Online (Sandbox Code Playgroud)
它们执行完全相同的操作(在这种情况下,至少是在其中更新一些GUI元素以及OpenCV线程感兴趣的区域)。两者有什么区别?
QObject派生和派生可以具有线程相似性,如果有,则可以安排对其方法的排队调用。这对于在性能并不重要的情况下进行轻松的同步非常有用,显然,您不会在紧密的循环中使用排队的连接,因为这样会导致巨大的性能损失。
就像一样deleteLater(),当您希望在事件循环迭代之间“干净”地进行调用时,如果您不希望其他任何正在运行的操作可能会在队列中循环调用,则排队调用会很有用,以最大程度地减少其他正在进行的操作可能带来的副作用。对排队的操作有负面影响,或者您想要执行旨在影响该操作的所有内容。同样,在删除的情况下,这将删除所有挂起的事件,连接等。
直接通话会快得多,但是您没有安全感。在大多数情况下,您可能会没事的,这将使最终的问题更加难以确定。
如果计划在不同线程之间执行此操作,则必须实现自己的同步,例如a QMutex,并确保对该对象的所有访问都通过该同步。它比使用排队的连接要快得多。