gpt4 book ai didi

windows - 如何从不同的线程执行 SendMessage?

转载 作者:可可西里 更新时间:2023-11-01 12:48:17 26 4
gpt4 key购买 nike

当我们发送消息时,“如果指定的窗口是由调用线程创建的,则立即将窗口过程作为子例程调用”。但是“如果指定的窗口是由不同的线程创建的,系统会切换到该线程并调用适当的窗口过程。只有当接收线程执行消息检索代码时,线程之间发送的消息才会被处理。” (取自 SendMessage 的 MSDN 文档)。

现在,我不明白如何(或者更恰本地说,何时)调用目标 Windows 过程。当然目标线程不会被抢占(程序计数器不变)。我假设调用将在某个等待函数(如 GetMessagePeekMessage)期间发生,这是真的吗?该过程在某处有详细记录?


更新其背后的基本原理由 GetQueueStatus()MsgWaitForMultipleObjects()QS_SENDMESSAGE 标志解释>:

QS_SENDMESSAGE
A message sent by another thread or application is in the queue.

这与 MSDN 文档中的附加说明一起意味着另一个线程发送的消息实际上已发布到队列中。然后,一旦 GetMessagePeekMessage 被调用,它将在任何其他发布的消息之前通过直接发送到窗口过程进行处理。

最佳答案

我看到这里有些困惑。

根据 MSDN 文档,当您以消息处理为目的接触当前线程的消息队列时(例如,如果您调用 PeekMessageGetMessage ),所有 待发送(即非排队)来自其他线程的消息被处理 - 传递给 WndProc - 然后检查消息队列,所以:

  • 发送的消息从不通过DispatchMessage并尽快处理:
    • 在当前线程中,它们只是传递给WndProc
    • 在另一个线程中,它们在任何发布的消息处理之前被处理
  • 为了能够处理发送的消息,目标线程仍然需要一个消息泵
  • PostThreadMessage做它所说的 - 发布线程队列中的消息 - 此类消息不定向到任何窗口,必须明确处理
  • 只有 DispatchMessage 处理的消息是由 PostMessage 创建的或一些系统设施(计时器、事件、用户输入等)
  • 为避免死锁,使用SendNotifyMessage , SendMessageTimeoutSendMessageCallback而不是普通的 SendMessage不同线程之间

要进一步引用,请研究 MSDN 的备注部分 PeekMessage条目。

关于windows - 如何从不同的线程执行 SendMessage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2942841/

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