gpt4 book ai didi

c++ - MFC:从另一个线程调用 CWnd 方法是否安全?

转载 作者:搜寻专家 更新时间:2023-10-31 00:08:34 28 4
gpt4 key购买 nike

其实我有两个问题:

  1. 从工作线程调用 SendMessage 是否安全?
  2. CWnd 方法(如 MessageBox)是否会在后台调用 API 函数 SendMessage

据我了解,当工作线程调用SendMessage时,它将消息推送到UI线程的消息队列中,并等待直到该消息被处理。在那种情况下,这样做是安全的。

这个我不是很清楚。如果我错了,请纠正我。

非常感谢。

------------------------更新-------------------- --------------

作为结论:

  • 跨线程调用 Windows API ::SendMessage::PostMessage 是安全的。
  • 跨线程调用CWnd 方法是不安全的。有些方法可能是安全的,但不能保证。

非常感谢大家。

最佳答案

Is it safe to call SendMessage from a worker thread?

是的。系统确保消息处理在接收线程上被序列化。跨线程发送消息时,发送方被阻塞,直到消息被处理。接收方只有在执行消息检索代码(GetMessagePeekMessage 等)时才处理跨线程发送的消息。发送的消息永远不会在消息队列中排队。 SendMessage 的文档有更多详细信息。

Do CWnd methods, like MessageBox, call API function SendMessage behind the scene?

是的。首先,消息框将接收标准窗口消息,如 WM_CREATEWM_NCCREATE 作为对话框构造的一部分。此外,对于拥有的窗口(如模态对话框),系统将向正在停用的窗口和正在激活的窗口发送 WM_ACTIVATE 消息。不过,我不确定为什么这很重要,或者你为什么特别问这个问题。

现在标题中的问题:

Is it safe to call CWnd methods from another thread?

一般来说,不会。不过,这确实取决于成员。有些可以安全调用,有些则不能。特别是,所有修改窗口状态(内容、可见性、激活等)的方法都应该只从创建窗口的线程中调用。如果调用不安全,系统仍将处于一致状态。但是,您的应用程序可能不是。

关于c++ - MFC:从另一个线程调用 CWnd 方法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48379003/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com