由于只有一个QCoreApplication
对象,为什么从哪个线程QCoreApplication::processEvents()
调用该对象很重要?
毕竟,所有线程共享相同的地址空间。
答案 0 :(得分:3)
您的标题不正确。可能您假设QCoreApplication::processEvents
是系统范围的“处理所有线程的所有可能事件”调用,但事实并非如此。您可以从您所在的任何线程(并且该线程正在运行事件循环)中调用它。
为什么从哪个线程调用它很重要:在Qt中,事件循环是每个线程的资源(您可以在任何线程上运行自己的事件循环),并且QCoreApplication::processEvents
处理当前线程的事件队列。
答案 1 :(得分:1)
如果看到此警告,则是因为processEvents
中的代码不是thread-safe。即使它们共享相同的地址空间,工作或数据也可以在一个线程上的状态下累积,然后该线程可能被中断,该状态可以由另一个线程修改,然后原始线程将恢复其处理,就像原始状态仍然有效,但现在无效。如果执行修改链表或任何非线程安全的数据结构之类的操作,则可能会丢失数据或破坏内存。