Ken*_*ang 2 c++ mfc multithreading cwnd sendmessage
其实我有两个问题:
SendMessage从工作线程调用是否安全?CWnd方法,比如MessageBox,SendMessage在场景后调用API函数?根据我的理解,当工作线程调用时SendMessage,它会将消息推送到UI线程的消息队列中,并等待直到处理此消息.在这种情况下,这样做是安全的.
我对此并不十分肯定.如果我错了,请纠正我.
非常感谢.
------------------------ update ------------------------- ---------
作为结论:
::SendMessage和::PostMessage跨线程是安全的.CWnd跨线程调用方法是不安全的.有些方法可能是安全的,但不能保证.非常感谢大家.
SendMessage从工作线程调用是否安全?
是.系统确保在接收线程上序列化消息处理.通过线程发送邮件时,发件人将被阻止,直到邮件被处理完毕.所述接收器仅处理时,它执行消息检索码(一跨线程发送消息GetMessage,PeekMessage等等).发送的消息永远不会在消息队列中排队.SendMessage的文档包含其他详细信息.
做
CWnd方法,比如MessageBox,SendMessage在场景后调用API函数?
是.例如,消息框将接收标准窗口消息,WM_CREATE或者WM_NCCREATE作为对话框构造的一部分.此外,对于拥有的窗口(如模态对话框),系统将向WM_ACTIVATE正在停用的窗口和正在激活的窗口发送消息.我不确定为什么这很重要,或者为什么你特别提出这个问题.
现在标题中的问题:
CWnd从另一个线程调用方法是否安全?
一般来说,没有.但这取决于会员.有些是安全的,有些则不是.特别是,只应从创建窗口的线程调用修改窗口状态(内容,可见性,激活等)的所有方法.如果呼叫不安全,系统仍将处于一致状态.但是,您的申请可能不是.