c++ - 我应该在 Qt 中尽可能多地使用信号/插槽吗?

标签 c++ performance qt qt5 c++17

来自 Qt documentation on Performance Considerations And Suggestions我得到以下信息:

use asynchronous, event-driven programming wherever possible

我不确定这意味着什么,所以想问一下。这是否意味着我应该尽可能使用信号/插槽(因为它们是异步的?)?

最佳答案

Qt 信号/槽不一定是异步的。来自 https://doc.qt.io/qt-5/threads-qobject.html :

Direct Connection: The slot is invoked immediately, when the signal is emitted. The slot is executed in the emitter's thread, which is not necessarily the receiver's thread.

Queued Connection: The slot is invoked when control returns to the event loop of the receiver's thread. The slot is executed in the receiver's thread.

Blocking Queued Connection: The slot is invoked as for the Queued Connection, except the current thread blocks until the slot returns.


由具有直接连接的插槽订阅的信号本质上是一个方法调用,您可以在运行时“连接”它。
另外,是的,您可能应该使用“尽可能”“尽可能”的“异步,事件驱动编程”来定义“尽可能”的合理定义。
显然,不要用信号和槽替换对象之间的所有方法调用。当你使用信号和槽时,不要总是让它们异步(排队) - 有时你会希望订阅你的信号的对象在发射函数继续之前完成它们对你的信号的“ react ”。
通常,当您并不真正关心信号的订阅者是否立即或稍后调用其插槽时,只需将它们连接起来而不指定连接类型,Qt 将使用自动连接,这将做正确的事情(线程-明智的)。当您关心时,只需指定您想要的连接类型。
如果您一开始对此感到困惑,一个合理的做法也可能是让所有连接默认排队 - 您不会真正注意到任何性能差异,这可能会阻止您意外编写依赖于插槽执行的代码“直接”,当那不是你的意图时。
链接中的建议主要针对在主线程上生成的任何事件,最有可能是由 UI 元素 - 按钮等。主要思想是您希望尽快处理任何输入事件,以保持主线程线程空闲用于接受任何以后的事件并呈现您的 UI,并且,如果事件导致完成任何重要工作,则将该工作移至另一个线程,并让您的主线程等待完成信号,以便您的主线程保持“ react 灵敏”。如果您希望您的 UI 立即响应任何事件,例如,通过启动“加载微调器”或显示进度条,您当然可以直接执行此操作。当然,这也适用于在后台发生较大计算时可能需要保持响应并处理其他事件的任何其他线程。

关于c++ - 我应该在 Qt 中尽可能多地使用信号/插槽吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60749482/

相关文章:

API >= 14 上的 Android 应用程序 onLowMemory()

mysql - 远程mysql服务器速度

qt - 如何在代码片段中获取当前文件名

c++ - 访问在 C++ 结构中声明的枚举变量

c++ - C++ 中的二维对象数组?

javascript - 使用 Modernizr 加载 HTML5 Shiv 的性能

c++ - 从支持 OpenSSL 支持的源代码构建 Qt 静态

c++ - 将数据从 C++ 加载到 QML Scatter3d 项

c++ - 我什么时候应该使用引用?

c++ - 需要相互引用的两个对象。馊主意?