翻译《The Old New Thing》- Why isn’t there a SendThreadMessage function?

Why isn't there a SendThreadMessage function? - The Old New Thing (microsoft.com)icon-default.png?t=N7T8https://devblogs.microsoft.com/oldnewthing/20081223-00/?p=19743

Raymond Chen 2008年12月23日


为什么没有 SendThreadMessage 函数?

简要

文章讨论了 Windows 中不存在 `SendThreadMessage` 函数的原因,指出通常应发送常规窗口消息而非线程消息,并建议使用窗口消息代替。

 

正文

        这里有一个有趣的客户问题:

Windows 有 `PostMessage` 和 `SendMessage`。它还有 `PostThreadMessage`,但没有 `SendThreadMessage`。为什么没有 `SendThreadMessage` 函数?我是否被迫用事件来模拟它?

        这个假想的 `SendThreadMessage` 函数会做什么?回想一下,`SendMessage` 将消息直接传递给窗口过程;消息泵从未看到它。这个假想的 `SendThreadMessage` 函数必须将消息直接传递给……什么?没有“线程窗口过程”可以传递给它。

        好的,也许你仍然打算在你的消息泵中处理线程消息,但你希望调用假想的 `SendThreadMessage` 函数的调用者等到你完成消息处理后再继续。但它怎么知道你完成了?它不能等待 `DispatchMessage` 返回,因为 `DispatchMessage` 不能分发线程消息。(它应该将它们分发到 _哪里_ ?)线程消息的处理完全由消息泵控制。窗口管理器给它一个线程消息,就窗口管理器而言,这就是故事的结尾。

        你可能会说,当有人下次调用 `GetMessage` 或 `PeekMessage` 时,线程消息的处理就完成了,但没有保证下次调用消息检索函数会来自消息泵。处理线程消息可能导致调用 `MessageBox`,作为一个模态函数,它将有自己的消息循环,这将调用 `GetMessage`,导致你的假想 `SendThreadMessage` 函数决定消息处理已经完成,而实际上它仍在进行。

        你应该怎么做呢?只创建一个窗口并发送给它一个消息。你想要使用 `PostThreadMessage` 函数的场景非常有限和特殊。在正常情况下,你只需要发送一个常规的窗口消息。

相关推荐

  1. 翻译prompt

    2024-06-09 18:16:04       29 阅读
  2. 翻译翻译!AI是什么?

    2024-06-09 18:16:04       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-09 18:16:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-09 18:16:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-06-09 18:16:04       87 阅读
  4. Python语言-面向对象

    2024-06-09 18:16:04       96 阅读

热门阅读

  1. 富格林:利用正规经验安全做单

    2024-06-09 18:16:04       27 阅读
  2. 《科学,无尽的前沿》—— 程序员必读

    2024-06-09 18:16:04       33 阅读
  3. 对象业务的重命名接口

    2024-06-09 18:16:04       35 阅读
  4. 简单的项目部署脚本(转载)

    2024-06-09 18:16:04       21 阅读
  5. Django按照文章ID更新文章

    2024-06-09 18:16:04       31 阅读
  6. 2903. 找出满足差值条件的下标 I

    2024-06-09 18:16:04       27 阅读
  7. 更新pip版本(在自己工程中的虚拟环境中)

    2024-06-09 18:16:04       28 阅读
  8. OpenVINO™ 助力 Qwen 2 —— 开启大语言模型新时代

    2024-06-09 18:16:04       35 阅读
  9. Linux防火墙配置001

    2024-06-09 18:16:04       23 阅读
  10. 解释关系型数据库和非关系型数据库的区别

    2024-06-09 18:16:04       27 阅读
  11. MySQL数据库基础练习系列2、图书借阅管理系统

    2024-06-09 18:16:04       30 阅读