应用程序中处理消息的顺序
- 格式:doc
- 大小:28.50 KB
- 文档页数:5
VC中WM_CLOSE、WM_DESTROY、WM_QUIT消息出现顺序及调用方式wxleasyland@2012.7wxleasyland试验:一、VC建的标准WIN32-HELLO WORLD程序中,case WM_DESTROY://PostQuitMessage(0);将这行屏蔽则,点关闭,窗口关闭了,但是程序进程还在!要在任务管理器中中止。
二、VC建的标准WIN32-HELLO WORLD程序中,1. 在WndProc()中加上case WM_CLOSE:WinExec("cmd /k echo WM_CLOSE: ",SW_SHOW);break;2. 按右上角的X、点图标\关闭、或者按ALT+F4,都只出现cmd窗,不会关闭程序。
因为原来是执行default: return DefWindowProc(hWnd, message, wParam, lParam); 即DefWindowProc来处理WM_CLOSE消息。
现在被case WM_CLOSE:拦截了。
3. 点菜单里的FILE\EXIT,则就是执行case WM_COMMAND: 里的case IDM_EXIT:DestroyWindow(hWnd); 了。
不会执行case WM_CLOSE:!!!DestroyWindow(hWnd); 会销毁窗口,同时发送WM_DESTROY消息直接让WndProc()处理(不经过消息队列)。
三、VC建的标准WIN32-HELLO WORLD程序中,1. 在WndProc()中加上case WM_CLOSE:WinExec("cmd /k echo WM_CLOSE: ",SW_SHOW);return DefWindowProc(hWnd, message, wParam, lParam);break;case WM_DESTROY:WinExec("cmd /k echo WM_DESTROY: ",SW_SHOW);PostQuitMessage(0);break;2. 按右上角的X、点图标\关闭、或者按ALT+F4,会先出现WM_CLOSE,再出现WM_DESTROY。
消息机制获取返回值的做法消息机制是一种常见的编程模式,用于在程序中传递数据和获取返回值。
它在各种应用场景中都有广泛的应用,特别是在并发编程和分布式系统中。
本文将介绍消息机制的基本概念、使用方法以及一些常见的应用场景。
一、消息机制的基本概念消息机制是一种通过消息传递来实现不同组件之间通信的方式。
在消息机制中,组件之间通过发送和接收消息来进行交互。
消息可以包含任意类型的数据,例如文本、数字、对象等。
发送消息的组件称为消息发送者,接收消息的组件称为消息接收者。
消息机制的核心思想是解耦,即将消息发送者和接收者解耦,使它们不需要直接知道对方的存在。
这样可以提高系统的灵活性和可扩展性,使各个组件能够独立地进行开发和维护。
二、消息机制的使用方法在使用消息机制时,通常需要定义消息的格式和协议。
消息的格式可以根据具体的需求进行设计,例如可以使用JSON、XML等格式来表示消息的内容。
协议则定义了消息的传输规则,例如消息的发送方式、接收方式、错误处理等。
消息的发送和接收可以通过不同的方式实现,例如使用消息队列、事件总线、远程过程调用等。
其中,消息队列是一种常见的实现方式,它可以将消息存储在队列中,然后按照一定的顺序进行处理。
消息队列可以提供可靠的消息传递和异步处理的能力,适用于高并发和分布式系统。
在使用消息机制时,通常需要注意以下几点:1. 定义清晰的消息格式和协议,以确保消息的正确解析和处理。
2. 使用合适的消息队列或其他消息传递方式,以满足系统的需求。
3. 考虑消息的可靠性和性能,例如使用消息确认机制和消息持久化等。
4. 处理消息的错误和异常情况,例如消息发送失败、消息接收超时等。
三、消息机制的应用场景消息机制在各种应用场景中都有广泛的应用,下面介绍几个常见的应用场景。
1. 异步任务处理:消息机制可以用于处理异步任务,例如将任务放入消息队列中,然后由后台线程进行处理。
这样可以提高系统的响应速度和吞吐量,同时减少前端线程的阻塞时间。
消息写作时间顺序
消息写作一般按照时间顺序进行,以确保读者能够按照事件的发生顺序理解信息。
以下是一种常见的时间顺序写作结构:
1. 引言:简要介绍所要讨论的主题或事件。
2. 起因:描述事件的起因或背景,提供相关背景信息。
3. 发展:按照时间顺序描述事件的发展过程,逐步介绍事件的重要细节和转折点。
4. 高潮:描述事件的高潮或关键时刻,可能是一个转折点、决策或重要事件。
5. 结果:说明事件的结果或影响,包括解决方案、教训或可能的后续行动。
6. 结论:总结事件,并强调重要信息或呼吁行动。
在写作过程中,确保用清晰、简洁的语言来表达信息,使用适当的过渡词或短语来连接段落和句子,以帮助读者理解信息的流程和关联性。
QT消息事件循环机制与多线程的关系QT是一个跨平台的C++库,用于开发图形用户界面(GUI)程序。
QT提供了一个消息事件循环机制,这是它在处理用户交互和更新图形界面时的核心机制。
多线程是指同时运行多个线程的并发编程模型。
在QT中使用多线程可以提高程序的性能和响应性,同时也对消息事件循环机制产生一定的影响。
QT的消息事件循环机制是基于事件驱动的,意味着所有的用户输入(例如鼠标点击、键盘输入等)和内部发起的操作(例如定时器事件、网络事件等)都会以事件的形式传递给程序。
这些事件将进入一个消息事件队列中,然后以先入先出的顺序被QT的事件循环机制依次处理。
多线程编程是为了提高程序的性能和响应性。
它允许程序同时执行多个任务,每个任务都在独立的线程中执行,可以并行地进行计算和IO操作。
多线程编程可以显著提高程序的吞吐量,同时也可以使应用程序更加流畅和具有良好的用户体验。
在QT中,多线程和消息事件循环机制之间存在一定的关系。
首先,QT的消息事件循环机制是单线程的,也就是说,所有的事件都在主线程中处理。
这是因为QT使用了一个称为事件派发器(Event Dispatcher)的组件,它负责将事件传递给特定的接收者并进行处理。
而事件派发器是线程特定的,因此在多线程环境下,每个线程都应该有自己的事件派发器。
在多线程编程中,采用主线程和工作线程的模型是最常见的方式。
主线程负责处理用户交互和更新图形界面,而工作线程负责执行耗时的计算和IO操作。
在这种情况下,主线程中的消息事件循环机制仍然起着重要的作用,而工作线程则负责执行任务和将结果返回给主线程。
在QT中,可以使用信号和槽机制来实现主线程和工作线程之间的通信。
当工作线程完成计算任务时,可以通过信号发射机制将结果发送给主线程。
主线程接收到信号后,会调用相应的槽函数来处理结果并更新UI 界面。
这样就实现了主线程和工作线程之间的协同工作。
在处理多线程的同时,需要注意避免多线程竞争条件(例如数据竞争和死锁),所以QT提供了一些线程安全的机制,例如互斥量(mutex)和条件变量(condition variable)。
消息循环的处理过程消息循环是计算机程序中一种常见的处理机制,用于接收、处理和分发用户输入、系统事件和消息的过程。
消息循环通常用于图形界面应用程序和操作系统中,是程序与用户进行交互的重要环节。
下面将详细讲解消息循环的处理过程。
一、消息的产生和传递在程序运行过程中,用户输入或系统事件会产生各种消息,如鼠标点击、键盘输入、窗口关闭等。
这些消息首先由操作系统捕获,并根据消息类型进行封装。
然后,操作系统将封装好的消息传递给相应的应用程序。
在应用程序中,消息通常被放入一个消息队列中,按照先进先出的顺序进行排列。
二、消息循环的启动和运行当应用程序启动后,消息循环开始运行。
消息循环是一个不断循环的过程,在每次循环中,应用程序会从消息队列中取出一条消息进行处理。
如果消息队列为空,应用程序会进入等待状态,直到有新的消息到达。
三、消息的处理在消息循环的每次循环中,应用程序会根据消息的类型进行相应的处理。
通常,应用程序会根据消息的目标窗口或控件,将消息发送给相应的处理函数进行处理。
处理函数可以是系统提供的默认处理函数,也可以是应用程序自定义的处理函数。
在处理函数中,应用程序可以根据消息的具体内容进行不同的操作。
例如,对于鼠标点击消息,应用程序可以根据鼠标的位置和按键状态来执行相应的操作,如打开菜单、选中文本等。
对于键盘输入消息,应用程序可以根据按键的键值来执行相应的操作,如输入文本、执行命令等。
四、消息的分发在处理完消息后,应用程序会根据需要将消息分发给其他窗口或控件。
例如,当用户点击一个按钮时,按钮会产生一个鼠标点击消息,应用程序会将这个消息发送给按钮对应的处理函数进行处理。
处理函数可以执行相应的操作,如显示下拉菜单、弹出对话框等。
五、消息循环的结束消息循环会一直运行,直到应用程序退出。
退出时,消息循环会被终止,程序不再接收和处理新的消息。
在退出前,应用程序通常会执行一些清理工作,如关闭文件、保存数据等。
总结消息循环是程序与用户进行交互的重要环节,它负责接收、处理和分发消息。
什么是消息队列?消息队列是一种在应用程序之间传递消息的通信模式。
它提供了一种异步的、解耦的方式来处理消息的发送和接收。
消息队列通常被用于解决分布式系统中的通信和数据交换问题。
以下是消息队列的一些关键概念和特性:1. 生产者和消费者:消息队列中的消息生产者负责发送消息到队列,而消息消费者则负责从队列中接收和处理消息。
生产者和消费者可以是独立的应用程序,它们通过消息队列实现解耦和异步通信。
2. 消息:消息是生产者发送到消息队列的数据单元。
它可以是任意格式的数据,如文本、JSON、XML等。
消息通常包含一些元数据,如标识符、时间戳等,以帮助消费者处理和识别消息。
3. 队列:队列是消息的存储和传递机制。
它可以是内存中的数据结构或持久化存储。
消息队列通常支持先进先出(FIFO)的消息传递顺序,确保消息按照发送的顺序进行处理。
4. 可靠性:消息队列通常提供可靠性保证,确保消息的可靠传递和处理。
它可以通过持久化消息和确认机制来确保消息不会丢失或重复处理。
消息队列还可以提供消息的持久化存储,以防止系统故障导致消息丢失。
5. 异步通信:消息队列采用异步通信模式,生产者和消费者可以独立地进行操作,不需要直接的即时响应。
这种异步模式可以提高系统的可伸缩性和性能,允许生产者和消费者在不同的速率下运行。
6. 解耦和削峰:消息队列可以实现系统组件之间的解耦,使得系统更加灵活和可维护。
通过将消息发送到队列中,生产者和消费者可以独立地演化和扩展,而不会相互影响。
此外,消息队列还可以用于削峰填谷,即在高峰期缓冲请求,以平稳处理流量。
7. 多模式通信:消息队列通常支持多种通信模式,如点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)。
点对点模式中,消息从一个生产者发送到一个特定的消费者;而发布/订阅模式中,消息被广播到多个订阅者。
消息队列在许多应用场景中得到广泛应用,特别是在分布式系统和微服务架构中。
数据结构中的栈与队列的应用场景栈与队列是数据结构中常见的两种基本数据类型,它们在不同的应用场景中发挥着重要作用。
下面将分别介绍栈和队列的应用场景。
栈的应用场景:1. 编辑器的撤销操作:在编辑器中,撤销(undo)操作是一个常见需求。
撤销操作通常是按照用户操作的反序执行,因此可以使用栈来存储每一次的操作,当用户执行撤销操作时,从栈中弹出最近的操作并执行对应的反操作。
2. 后退按钮的实现:在浏览器中,后退按钮用于返回上一个访问的网页。
通过使用栈来存储用户的访问记录,每当用户访问一个新的页面时,将该页面的地址压入栈中。
当用户点击后退按钮时,从栈中弹出最近访问的页面地址并跳转到该页面。
3. 函数调用与返回:在程序中,函数的调用和返回通常遵循“后进先出”的原则,即后调用的函数先返回。
因此,可以使用栈来实现函数调用与返回的过程。
每当一个函数被调用时,将该函数的执行环境(包括参数、局部变量等)压入栈中;当函数执行完毕后,从栈中弹出该函数的执行环境,恢复上一个函数的执行。
队列的应用场景:1. 消息队列:在分布式系统和异步通信中,消息队列用于解耦发送方和接收方之间的耦合性。
发送方将消息发送到队列的末尾,接收方从队列的头部获取消息进行处理。
消息队列可以实现异步处理、削峰填谷等功能,常见的消息队列系统有RabbitMQ和Kafka等。
2. 操作系统中的进程调度:在操作系统中,进程调度用于控制多个进程的执行顺序。
常见的调度算法中,有使用队列来实现的先来先服务(FCFS)调度算法和轮转调度算法。
进程按照到达时间的顺序加入队列,在CPU空闲时,从队列的头部取出一个进程执行。
3. 打印队列:在打印机等资源共享环境中,通常会使用打印队列来管理多个打印请求。
每当用户提交一个打印请求时,将该请求加入打印队列的末尾,打印机从队列的头部取出请求进行打印。
这样可以保证每个用户的打印请求按照提交的顺序进行处理。
综上所述,栈和队列在不同的应用场景中发挥着重要作用。
VC中WM_CREATE、WM_INITDIALOG消息出现顺序及调用方式wxleasyland@2012.7wxleasyland试验:VC建的标准WIN32-HELLO WORLD程序中:1.在CreateWindow()前面加上语句WinExec("cmd /k echo now call CreateWindow()",SW_SHOW); Sleep(5000);2.在CreateWindow()后面加上语句WinExec("cmd /k echo CreateWindow() RETURN",SW_SHOW);3.在WndProc()中加上case WM_CREATE:WinExec("cmd /k echo WndProc(): WM_CREATE: appear!",SW_SHOW);Sleep(5000);break;4.运行,发现,先出现now call CreateWindow()、再WndProc(): WM_CREATE: appear!、最后CreateWindow() RETURN。
结论:CreateWindow()是在运行后、返回前,发送消息WM_CREATE,并阻塞!WM_CREATE消息直接发给消息处理函数WndProc()执行!而不是通过消息队列(GetMessage、DispatchMessage等)!!其实就是CreateWindow()直接拿消息WM_CREATE去调用WndProc()!!!!!如果WndProc()返回0,CreateWindow()正常返回hWnd。
如果WndProc()返回-1,CreateWindow()销毁窗口,并返回NULL。
所以WM_CREATE时,CreateWindow()内部已经创建好窗口了,但还没有返回,还没有hWnd!即窗口真正还没有创建结束。
这时这里不能有对窗口上的控件操作的函数,不然就会“程序执行了非法操作”。
消息队列的原理
消息队列是一种在应用程序之间实现异步通信的机制。
它是基于生产者-消费者模式的,即一个或多个生产者将消息放入队
列中,一个或多个消费者从队列中获取消息进行处理。
消息队列的原理如下:
1. 生产者发送消息:生产者将消息发送到消息队列中。
消息可以是任何形式的数据,如文本、图像、音频等。
2. 消息队列存储消息:消息队列是一个存储消息的缓冲区,它可以按照先进先出(FIFO)的顺序存储消息。
消息队列一般
基于内存或者持久化存储。
3. 消费者获取消息:消费者可以在任何时候从消息队列中获取消息。
消费者可以单个或批量获取消息,具体取决于实现方式。
4. 消费者处理消息:消费者获取到消息后,将对消息进行处理。
处理方式可以是执行特定的业务逻辑、将消息写入数据库、发送到其他系统等。
5. 消息确认和删除:消费者在处理完消息后,可以向消息队列发送确认消息,告知消息队列该消息已经成功处理。
消息队列接收到确认消息后,将删除该消息。
6. 处理失败的消息:如果消费者在处理消息时发生错误,可以进行相应的错误处理,例如记录日志、重试处理、发送到死信队列等。
消息队列的好处包括解耦、削峰填谷、提高系统可伸缩性、提高系统可靠性等。
它常用于处理高并发、异步处理、系统解耦等场景。
应用程序中处理消息的顺序(转)
MFC应用程序中处理消息的顺序
1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc
2.AfxCallWndProc() 该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,
然后调用WindowProc()函数
3.WindowProc() 该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数
4.OnWndMsg() 该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息
响应函数,对于WM_NOTIFY消息
调用OnNotify()消息响应函数。
任何被遗漏的消息将是一个窗口消息。
OnWndMsg()函数搜
索类的消息映像,以找到一个
能处理任何窗口消息的处理函数。
如果OnWndMsg()函数不能找到这样的处理函数的话,则
把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数
5.OnCommand() 该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明
该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;
如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数
6.OnCmdMsg() 根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的
传递命令消息和控件通知。
例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该
类寻找一个消息处理函数
MFC应用程序创建窗口的过程
1.PreCreateWindow() 该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数
(可以设置窗口风格等等)
2.PreSubclassWindow() 这也是一个重载函数,允许首先子分类一个窗口
3.OnGetMinMaxInfo() 该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者
最小尺寸
4.OnNcCreate() 该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区
即将被创建
5.OnNcCalcSize() 该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小
6.OnCreate() 该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建
7.OnSize() 该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经
发生变化
8.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动
9.OnChildNotify() 该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被
创建
MFC应用程序关闭窗口的顺序(非模态窗口)
1.OnClose() 消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息
2.OnDestroy() 消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息
3.OnNcDestroy() 消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息
4.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用
MFC应用程序中打开模式对话框的函数调用顺序
1.DoModal() 重载函数,重载DoModal()成员函数
2.PreSubclassWindow() 重载函数,允许首先子分类一个窗口
3.OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
4.OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
5.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动
6.OnSetFont() 消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体
7.OnInitDialog() 消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,
或者是创建新控件
8.OnShowWindow() 消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用
9.OnCtlColor() 消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件
的颜色
10. OnChildNotify() 重载函数,作为WM_CTLCOLOR消息的结果发送
MFC应用程序中关闭模式对话框的顺序
1.OnClose() 消息响应函数,响应WM_CLOSE消息,当"关闭"按钮被单击的时候,该函数被调用
2.OnKillFocus() 消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送
3.OnDestroy() 消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送
4.OnNcDestroy() 消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送
5.PostNcDestroy() 重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用
打开无模式对话框的顺序
1.PreSubclassWindow() 重载函数,允许用户首先子分类一个窗口
2.OnCreate() 消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建
3.OnSize() 消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化
4.OnMove() 消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动
5.OnSetFont() 消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体
以上这些的执行都是按给定的顺序执行!
只有清楚的了解应用程序的执行顺序,才能在编写代码的时候知道,在什么时候应该执行什么,以及在什么地方该处理什么!
这只是本人总结的一点小小的经验,希望能对MFC的初学者有所帮助!。