2

其实我有两个问题:

  1. SendMessage从工作线程调用是否安全?
  2. CWnd方法,例如,在幕后MessageBox调用 API 函数吗?SendMessage

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

我不太确定这一点。如果我错了,请纠正我。

非常感谢。

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

作为结论:

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

非常感谢大家。

4

2 回答 2

5

SendMessage从工作线程调用是否安全?

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

CWnd方法,例如,在幕后MessageBox调用 API 函数吗?SendMessage

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

现在你标题中的问题:

CWnd从另一个线程调用方法是否安全?

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

于 2018-01-22T10:22:59.520 回答
1

线程访问 UI的唯一方法是使用SendMessagePostMessage

考虑一台具有一个内核的机器,其中发生上下文切换并且您从工作线程直接访问 UI,您可能会破坏 UI 线程寄存器!

基本上每个 UI 框架都提供了一种机制(很多次),用于从线程进行 UI 更改。例如,Android 提供了一个ASyncTask和一个Handler.

于 2018-01-25T08:49:55.783 回答