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

时间:2019-10-24 15:25:51

标签: c++ qt event-loop qeventloop

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

毕竟,所有线程共享相同的地址空间。

2 个答案:

答案 0 :(得分:3)

您的标题不正确。可能您假设QCoreApplication::processEvents是系统范围的“处理所有线程的所有可能事件”调用,但事实并非如此。您可以从您所在的任何线程(并且该线程正在运行事件循环)中调用它。

为什么从哪个线程调用它很重要:在Qt中,事件循环是每个线程的资源(您可以在任何线程上运行自己的事件循环),并且QCoreApplication::processEvents处理当前线程的事件队列。

答案 1 :(得分:1)

如果看到此警告,则是因为processEvents中的代码不是thread-safe。即使它们共享相同的地址空间,工作或数据也可以在一个线程上的状态下累积,然后该线程可能被中断,该状态可以由另一个线程修改,然后原始线程将恢复其处理,就像原始状态仍然有效,但现在无效。如果执行修改链表或任何非线程安全的数据结构之类的操作,则可能会丢失数据或破坏内存。