`
ychw365
  • 浏览: 55136 次
  • 性别: Icon_minigender_1
  • 来自: 长春
最近访客 更多访客>>
社区版块
存档分类
最新评论

MFC中消息循环处理的几个函数之间的区别

阅读更多

Windows编程中一个比较原始的问题就是消息循环,现在很少有人关心这些了;

  我个人对消息循环比较感兴趣,对底层的很多细节想深入了解!

  以下说明几个消息循环中的常用函数进行对比

  1 PostMessage 与 SendMessage 函数对比

 

  

  This function places a message in the message queue associated with the thread that created the specified window and then returns without waiting for the thread to process the message. Messages in a message queue are retrieved by calls to the GetMessage or PeekMessage function.

BOOL PostMessage(
  HWND hWnd, 
  UINT Msg, 
  WPARAM wParam, 
  LPARAM lParam 
); 

 

 SendMessage把消息直接发送到窗口,并调用此窗口的相应消息处理函数,等消息处理函数结束后SendMessage才返回!SendMessage发送的消息不进入系统的消息队列;SendMessage函数有返回值

The SendMessage function sends the specified message to a window or windows. It calls the window procedure for the specified window and does not return until the window procedure has processed the message.

To send a message and return immediately, use the SendMessageCallback or SendNotifyMessage function. To post a message to a thread's message queue and return immediately, use the PostMessage or PostThreadMessage function.

 

Syntax

LRESULT SendMessage(      

    HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

  PostMessage将消息发送到与创建窗口的线程相关联的消息队列后立即返回;PostMessage函数没有返回值;

 

  2 GetMessage 与 PeekMessage函数的对比

  GetMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)

  PeekMessage(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,UINT wRemoveMsg)

  根据参数可以看出以上2个函数的区别,参数wRemoveMsg的作用是指定消息获取的方式,如果设为PM_NOREMOVE,那么消息将不会从消息队列中被移出,如果设为PM_REMOVE,那么消息将会从消息队列中被移出;

  还有区别:

  他们如果没有捕获到消息,程序的主线程会被操作系统挂起。当操作系统再次回来照顾此线程时,发现消息队列中仍然没有消息可取,此时两个函数的行为就不同了:

  GetMessage : 过门不入,操作系统再次挂起此线程,去照顾别的线程;

  PeekMessage: 取回控制权,使程序执行一段时间,等待可能的消息进入消息队列并将其捕获;这时程序进入空闲时间阶段;

 

分享到:
评论

相关推荐

    模仿MFC的消息函数映射

    而在MFC中,通过消息映射,可以将特定的消息与特定的成员函数关联起来,这样当消息到达时,MFC会自动调用对应的成员函数,无需手动处理消息队列。 消息映射通常在C++类的头文件中定义,使用`BEGIN_MESSAGE_MAP`、`...

    MFC程序的初始化过程.MFC也是个Windows程序,有窗口注册操作,有窗口产生操作,有消息循环,也有窗口函数。在这里,我想为大家建立一下MFC程序初始化过程的流程。使大家对MFC有个比较深入的认识。

    - 在`CWinThread`的`Run()`方法中,MFC会调用`PeekMessage()`和`DispatchMessage()`处理消息循环。消息循环是Windows程序的心脏,它不断检查消息队列并分发消息到相应的窗口函数处理。 6. **应用程序入口点**: -...

    按键消息处理函数处理函数

    3. **消息处理函数(Message Handler Function)**:这些是实际处理消息的函数。对于键盘事件,常见的消息有`WM_KEYDOWN`(键被按下)和`WM_KEYUP`(键被释放)。处理这些消息的函数会根据键的状态(是否被按住、...

    深入剖析MFC中Windows消息处理机制

    2. **消息传递**: 模式对话框的消息处理与SDI结构类似,都是通过消息循环来接收和处理消息。但是,由于对话框是模态的,因此它的消息处理逻辑会被暂停,直到对话框关闭。 3. **响应消息**: 对话框的消息响应通常在`...

    消息循环重载 message overload vc 源码

    在Windows API中,通常使用`GetMessage`、`TranslateMessage`和`DispatchMessage`三个函数构建一个基本的消息循环。`GetMessage`用于从消息队列中获取下一个消息,`TranslateMessage`将虚拟键转换为字符键,而`...

    MFC中消息映射机制分析

    MFC的消息映射机制有以下几个优势: 1. **简化代码**:它隐藏了底层的消息处理细节,使得程序员可以专注于业务逻辑。 2. **增强可读性**:通过命令ID和处理函数的明确关联,使得代码更易理解和维护。 3. **灵活性**...

    MFC自定义消息

    5. **接收并处理消息**:当`WM_MY_CUSTOM_MESSAGE`到达目标窗口时,MFC会自动调用我们在消息映射表中指定的处理函数`OnMyCustomMessage()`,在此函数中执行相应的操作。 在`MyMessage`项目中,你可以看到一个具体的...

    MFC 消息循环贴图---金山毒霸界面

    在MFC中,消息循环通常由`Run`函数实现,如`CWinApp`类的成员函数。消息循环不断检查消息队列,一旦发现新消息,就调用相应的消息处理函数进行处理。这对于用户界面的响应性至关重要,因为它确保了用户的输入能够被...

    MFC各个类函数简介

    本篇文章将详细介绍MFC中的几个关键类及其主要函数,帮助初学者快速掌握MFC的基础知识。 1. CWinApp 类: CWinApp是MFC中的核心类,每个MFC应用都从这个类派生。它的主要功能包括初始化、运行和终止应用程序。...

    MFC中的RTTI,动态创建,消息机制

    MFC的主消息循环(`Run()`函数)就是一个消息泵,它不断地从消息队列中取出消息并分发到相应窗口的处理函数。 4. 消息过滤和预处理: - MFC提供`PreTranslateMessage()`函数,允许在消息被默认处理之前进行过滤和...

    message mfc消息处理

    ### MFC消息处理详解 #### 一、MFC与Windows消息机制 ...通过以上几个方面的详细介绍,我们可以看到MFC消息处理的核心机制及其在实际应用中的实现方式。理解和掌握这些内容对于开发高质量的Windows应用程序至关重要。

    C++ MFC 线程与窗口 SendMessage

    为了确保窗口的消息循环能够正确处理消息,通常建议所有的窗口创建和消息处理都在创建窗口的线程中进行。 #### 2. `ON_MESSAGE` 的使用方法 `ON_MESSAGE`是MFC提供的宏,用于将特定的消息映射到成员函数上。具体...

    MFC多线程发送消息

    2. AfxPumpMessage():在非主消息循环的线程中,需要调用这个函数来处理线程的消息,确保消息能被正确处理。 3. CWinApp::OnIdle():主线程可以通过重写这个函数来检查和处理线程间的通信消息。 四、消息发送示例 ...

    关于mfc的消息响应

    在MFC中,对话框程序的消息处理主要依赖于`CWinThread`类的成员函数`Run()`,该函数会不断地循环读取消息队列中的消息并将其发送给相应的窗口处理函数。这个过程包括几个关键步骤: 1. **消息获取**:使用`...

    MFC 科学计算器(包括常用的三角函数)

    在这个“MFC科学计算器”项目中,开发者利用MFC框架创建了一个功能丰富的科学计算器,它不仅支持基本的四则运算,还包含了常用的三角函数,如正弦、余弦、正切等,为用户提供了一种便捷的计算工具。 **MFC框架** ...

    多线程解决mfc对话框未响应、卡死问题

    通常需要重写以下几个关键函数: - `InitInstance()`:初始化线程,可以在这里进行线程特定的设置。 - `Run()`:线程的主要工作区域,执行耗时任务。 - `ExitInstance()`:线程退出前清理资源。 **4. 数据通信与...

    自定义线程消息循环

    5. **处理消息**:在窗口过程(WndProc)或者自定义的回调函数中,处理接收到的自定义消息。 线程消息循环不仅限于用户界面(UI)线程,非UI线程也可以利用它来进行异步通信。例如,在线程池中,我们可以创建一个...

    vc mfc源码 api函数库

    在学习MFC源码时,重点关注以下几个方面: 1. 类层次结构:MFC采用的是面向对象的设计,其类之间存在着继承关系。理解类的层次结构有助于理清不同类的功能和它们之间的关联。 2. 事件驱动模型:MFC基于Windows的...

    MFC中文帮助文档

    - **消息映射机制**:MFC通过消息映射将Windows消息与成员函数关联,使得处理消息变得更简单。 - **资源管理**:MFC支持资源文件,其中包含对话框、图标、菜单等资源的定义。 - **异常处理**:MFC使用CException类...

Global site tag (gtag.js) - Google Analytics