c++ - 使用 SendMessage() 多线程

标签 c++ windows multithreading winapi message-queue

如果我使用从不同线程到一个接收器的 SendMessage() 会怎样?想象一种情况,当接收方仍在处理来自线程 1 的消息时,线程 2 发送了另一条消息(使用 SendMessage())。接收端会发生什么?它是否停止执行 Message1,处理 Message2 并在完成 Message2 后返回 Message1?还是 Message2 等待 Message1 结束?

最佳答案

基本规则是:线程调度跨线程发送消息的唯一时间是在该线程上调用消息检索函数(GetMessagePeekMessage 等)时。消息检索函数首先检查任何跨线程发送的消息,一个接一个地分派(dispatch)它们,然后继续从线程的消息队列中检索消息。

这有两个后果:

  • 当接收线程未处理1)任何排队的消息时,将调度跨线程发送的消息。
  • 当接收线程未处理1) 任何其他跨线程发送的消息时,将调度跨线程发送的消息。

在您的特定示例中,接收方将继续处理 Message1 直到完成,并在下次调用消息检索函数时继续分派(dispatch) Message2。

此规则有一个值得注意的异常(exception):正在等待 SendMessage 的线程返回可以调度入站跨线程发送的消息2)。这意味着存在重新进入的可能性。再次以您的示例为例,假设 Message1 的消息处理程序在某个时刻调用了 SendMessage,很可能是在继续处理 Message1 之前分派(dispatch)了 Message2。

总结一下:

  • 跨线程发送的消息在接收线程上连续分派(dispatch)。
  • 有几个明确定义的时间,线程会分派(dispatch)跨线程发送的消息。
  • 虽然跨线程发送的消息永远不会并发处理,但没有原子性规则;为重新进入做好准备。


1) 假设调用消息检索函数不是正常消息处理的一部分。
2) 参见 When can a thread receive window messages?有关为什么会这样的详细信息。

关于c++ - 使用 SendMessage() 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35543982/

相关文章:

c++ - 如果在开关盒内,限制案例

python - 将 Mat 参数从 Python 传递给 C++ 方法

c++ - 在 vim 中创建 include guard

python - 在 Tkinter 中制作自定义标题栏时遇到问题

c# - 使用任务并行库时与对象同步

c - 如果多个 pthread 使用相同的函数会发生什么

c++ - glOrtho 不改变 2D 窗口中的坐标系?

c++ - opencv wasm 构建在 Windows 上失败

windows - 在哪些情况下程序会以 0x40010004 代码退出?

ios - 从不正确的线程访问的 Realm - Swift 3