为什么要避免嵌套QEventLoops?

Muc*_*arn 8 qt

在他的Qt事件循环,网络和I/O API谈话中,Thiago Macieira提到QEventLoop应该避免嵌套:

QEventLoop用于嵌套事件循环...如果可以的话,请避免使用它,因为它会产生许多问题:事情可能会重新进入,新的套接字或定时器激活是你没想到的.

任何人都可以扩展他指的是什么吗?我维护了许多使用模态对话框的代码,这些代码在exec()调用时在内部嵌套一个新的事件循环,因此我非常有兴趣知道这可能导致什么样的问题.

Rei*_*ica 9

  1. 嵌套的事件循环会花费1-2kb的堆栈.

  2. 它具有重新输入调用堆栈上已有代码的能力.无法保证任何代码都是可重入的.我在谈论你的代码,而不是Qt的代码.

  3. 在当前的Qt中,有两个地方,由于长期存在API错误或平台不足,您必须使用嵌套exec:QDrag和平台文件对话框(在某些平台上).您根本不需要在其他任何地方使用它.对于非平台模式对话框,您不需要嵌套事件循环.

  4. 重新进入事件循环通常是由于编写伪同步代码而导致缺失yield(),将头埋在沙中并使用co_yield.这样的代码通常最终成为意大利面并且是不必要的.干净地编写异步代码通常是通过状态机完成的,请参阅此答案以获取示例,并将QP框架用于与实现不同的实现co_await.