QCoreApplication::processEvents - 为什么必须只从主线程调用它?

QCoreApplication::processEvents - why must it be called from main thread only?

既然只有一个 QCoreApplication 对象,为什么从哪个线程调用 QCoreApplication::processEvents() 很重要?

毕竟线程都共享同一个地址space。

如果您看到此警告,那是因为 processEvents 中的代码不是 thread-safe。即使它们共享相同的地址 space,工作或数据可能会在一个线程的状态中累积,然后线程可能会被中断,状态可能会被另一个线程修改,然后原始线程将恢复其状态就好像原始状态仍然有效一样处理,但现在不是了。如果您正在执行修改链接列表或任何非线程安全数据结构等操作,则可能会丢失数据或损坏内存,以及其他危险。

您的标题不正确。可能您假设 QCoreApplication::processEvents 是 system-wide "process all possible events of all threads" 调用,但事实并非如此。您可以从您所在的任何线程调用它(并且是 运行 一个事件循环)。

为什么从哪个线程调用它很重要:在 Qt 中,事件循环是一个 per-thread 资源(您可以 运行 在任何线程上拥有事件循环)并且 QCoreApplication::processEvents处理当前线程的事件 queue。