首页 > 其他分享 >翻译《The Old New Thing》- Why isn’t there a SendThreadMessage function?

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

时间:2024-06-09 10:04:21浏览次数:20  
标签:function 调用 Old 函数 there 线程 消息 窗口 SendThreadMessage

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` 函数的场景非常有限和特殊。在正常情况下,你只需要发送一个常规的窗口消息。

标签:function,调用,Old,函数,there,线程,消息,窗口,SendThreadMessage
From: https://blog.csdn.net/weixin_41863029/article/details/139551833

相关文章

  • GLM-4-9B领先!伯克利函数调用榜单BFCL的Function Calling评测方法解析与梳理
    智谱公布的GLM-4-9B基于BFCL榜单的工具调用能力测试结果©作者|格林来源|神州问学在智谱最新开源的GLM-4-9B-Chat中,其工具调用能力在BFCL(伯克利函数调用排行榜)榜上获得了超高的总BFCL分,和gpt-4-turbo-2024-04-09几乎不相上下。在榜单中,还提到了AST总分以及Exec总分两个......
  • 在 Jupyter 编辑函数(Edit function in Jupyter)
    在JupyterNotebook里编辑一个已经存在的函数是可以实现的。你需要重新定义这个函数并执行该单元格。这将覆盖之前的定义,使用新的代码。例如,如果你有一个函数fetch_california_housing,你可以按照以下步骤编辑和重新定义它:找到该函数的定义单元格,或者创建一个新的单元格......
  • js 中 (function($){...})(jQuery) 含义
    原文链接:https://www.cnblogs.com/Jeely/p/10715089.htmljs中(function($){...})(jQuery)含义js中定义函数常用写法是functionname(arg){//arg则是匿名函数的参数。//...}调用函数时的写法是:name(arg);======================================================......
  • ubuntu 解决apt-get: Some index files failed to download. They have been ignored,
    很多博主都有编写把resolve.config文件里的conserve改为8.8.8.8,但还有一种可能是没有用最新的镜像源网址,导致找不到文件,推荐找一些最近的含有镜像源的帖子。另外就是连过外网之后导致板子和环境的网域不一样,都有可能。一般把这三种方法试了之后都是可以解决问题的。镜像源没有......
  • 【OpenCV函数详解之cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_
    文章目录cv2.calcOpticalFlowPyrLK()函数介绍:函数定义:参数说明:返回值示例代码执行结果:**总结:**p1,st,err=cv2.calcOpticalFlowPyrLK(old_gray,frame_gray,p0,None,**lk_params)解释:函数:参数:返回值:使用:cv2.calcOpticalFlowPyrLK()函数介绍:cv2.calcOpti......
  • yolov8改进之嵌入Gold层
    #加载模型model=YOLO("yolov8n.yaml")  #从头开始构建新模型model=YOLO("yolov8n.pt")  #加载预训练模型(建议用于训练)#使用模型model.train(data="coco128.yaml",epochs=3)  #训练模型metrics=model.val()  #在验证集上评估模型性能results=model......
  • 'scanf': This function or variable may be unsafe. Consider using scanf_s instead
    在C++中使用scanf时应注意两点1.导入#include<cstdio>2.将scanf改成scanf_s  VS2022实现查找替换编辑——》查找和替换——》在文件中替换 输入要查找替换的名称 点击全部替换完成......
  • 翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL
    Whatadrag:DraggingaUniformResourceLocator(URL)andtext-TheOldNewThinghttps://devblogs.microsoft.com/oldnewthing/20080313-00/?p=23123RaymondChen 2008年03月13日 麻烦的拖拽:拖拽统一资源定位符(URL)和文本简要        这篇文章主要讲......
  • 翻译《The Old New Thing》- What a drag: Dragging a Uniform Resource Locator (URL
    Whatadrag:DraggingaUniformResourceLocator(URL)-TheOldNewThing(microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080312-00/?p=23133RaymondChen 2008年03月12日麻烦的拖拽:拖拽统一资源定位符(URL)简要本文介绍了如何在Windows程序中实......
  • css45 CSS Math Functions
    https://www.w3schools.com/css/css_math_functions.asp TheCSSmathfunctionsallowmathematicalexpressionstobeusedaspropertyvalues.Here,wewillexplainthecalc(),max()andmin()functions.Thecalc()FunctionThecalc()functionperformsac......