【问题标题】:QCoreApplication::processEvents - why must it be called from main thread only?QCoreApplication::processEvents - 为什么只能从主线程调用它?
【发布时间】:2020-02-20 23:31:20
【问题描述】:

既然只有一个QCoreApplication 对象,那么从哪个线程调用QCoreApplication::processEvents() 有什么关系呢?

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

【问题讨论】:

  • 不确定我是否理解这个问题...processEvents() 文档说:调用此函数只为调用线程处理事件。 所以如果哪个线程都没有关系它是从...调用它无法完成它的工作?还是您在问它是如何工作的?

标签: c++ qt event-loop qeventloop


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 这是有道理的。谢谢。我会等待几个小时才能接受答案。
    • 它在processEvents docs 中声称它确实是线程安全的。尽管这是对线程安全的一个很好的简明解释,所以我不愿意投反对票:)跨度>
    猜你喜欢
    • 2011-01-10
    • 2015-09-06
    • 2019-06-18
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多