深入浅出MFC--第一章
Windows程序的生与死
当使用者按下系统菜单中的Close命令项,系统送出WM_CLOSE。通常程序的窗口函数不拦截次消息,于是DefWindowProc函数处理它。DefWindowProc收到WM_CLOSE后,调用DestoryWindow把窗口清除。DestroyWindow本身又会送出WM_DESTROY。程序对WM_DESTROY的标准反应是调用PostQuitMessage。PostQuitMessage没什么其它动作,就只送出WM_QUIT消息,准备让消息循环退出。
空闲时间的处理:OnIdle
所谓空闲时间(Idle time),是指【系统中没有任何消息等待处理】的时间。举个例子,没有任何程序使用定时器(timer,它会定时送来WM_TIMER),使用者也没有碰触键盘和鼠标或任何外围设备,那么,系统就处在所谓的空闲时间。
空闲时间常常发生。不要认为你移动鼠标时产生了一大堆的WM_MOUSEMOVE,事实上夹杂在每一个WM_MOUSEMOVE之间就可能存在许多空闲时间。毕竟,计算机速度超乎想象。
后台工作最适宜在空闲时间完成。传统的SDK程序如果要处理空闲时间,可以以下列循环取代WinMain中传统的消息循环:
while(TRUE)
{
if(PeekMessage(&msg, NULL, , , PM_REMOVE))
{
if(msg.message == WM_QUIT)
{
break;
}
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
OnIdle();
}
}
原因是PeekMessage和GetMessage的不同,GetMessage是阻塞的,而PeekMessage是非阻塞的。
Console程序和DOS程序的区别
console程序是指在Windows下开发的不实用UI的控制台程序
dos程序是指在dos系统下开发的程序
一个进程的诞生与死亡
执行一个程序就必然产生一个进程。最直接的程序执行方式是在shell中即资源管理器找那个以鼠标双击某个可执行文件的图标,执行起来的App进程其实是shell调用CreateProcess激活的。
让我们看看整个流程:
1、shell调用CreateProcess激活App.exe。
2、系统产生一个【进程核心对象】,计数值为1。
3、系统为此进程建立一个4GB的地址空间。
4、加载器将必要的码加载到上述地址空间中,包括App.exe的程序、资料,以及所需的动态链接库。加载器如何知道要加载哪些dll呢?它们被记录在可执行文件的.idata section中。
5、系统为此进程建立一个执行线程,称为主执行线程(primary thread)。执行线程才是CPU时间的分配对象。
6、系统调用C runtime函数库的startup code。
7、startup code调用App程序的WinMain函数。
8、App程序开始运行。
9、使用者关闭App主窗口,使WinMain中的消息循环结束掉,于是WinMain结束。
10、回到startup code。
11、回到系统,系统调用ExitProcess结束进程。
可以说,透过这种方式执行起来的所有程序都是shell的子进程。本来,父进程与子进程之间可以有某些关系存在,但shell在调用CreateProcess时已经把这种关系剪断,因此它们是独立的实例。
深入浅出MFC--第一章的更多相关文章
- 《深入浅出MFC》下载
百度云及其他网盘下载地址:点我 编辑推荐 <深入浅出MFC>内含光盘一片,书中所有原始码与可执行文件尽在其中. 作者简介 侯俊杰,先生不知何许人也,闲静少言,不慕荣利.好读书,求甚解:每有 ...
- 第一章、C#委托和事件(Delegate、Event、EventHandler、EventArgs)
第一章.C#委托和事件(Delegate.Event.EventHandler.EventArgs) 分类: 学习笔记-C#网络编程2012-12-08 14:10 7417人阅读 评论(3) 收藏 ...
- 评侯捷的<深入浅出MFC>和李久进的<MFC深入浅出>
侯捷的<深入浅出mfc>相信大家都已经很熟悉了,论坛上也有很多介绍,这里我就不多说了. 而李久进的<mfc深入浅出>,听说的人可能就少得多.原因听说是这本书当时没有怎么宣传,而 ...
- 深入浅出MFC——MFC六大关键技术仿真(二)
1. 仿真MFC目的:以MFC为例,学习application framework的内部运行.MFC六大关键技术: (1)MFC程序的初始化过程 (2)RTTI(Runtime Type Inform ...
- 第一章:CDib类库的建立
VC++图像处理程序设计(第1版) 杨淑莹 编著 边奠英 主审 第一章 位图基础 Joanna-In-Hdu&Hust 手工打,印象更深刻 使用工具 VS2010 mfc 整本 ...
- 深入理解Magento - 第一章 - Magento强大的配置系统
深入理解Magento 作者:Alan Storm翻译:zhlmmc 前言第一章 - Magento强大的配置系统第二章 - Magento请求分发与控制器第三章 - 布局,块和模板第四章 - 模型和 ...
- 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:本人目前在杭州某家互联网公司工作, ...
- MyBatis3.2从入门到精通第一章
第一章一.引言mybatis是一个持久层框架,是apache下的顶级项目.mybatis托管到goolecode下,再后来托管到github下.(百度百科有解释)二.概述mybatis让程序将主要精力 ...
- Nova PhoneGap框架 第一章 前言
Nova PhoneGap Framework诞生于2012年11月,从第一个版本的发布到现在,这个框架经历了多个项目的考验.一直以来我们也持续更新这个框架,使其不断完善.到现在,这个框架已比较稳定了 ...
- 第一章 MYSQL的架构和历史
在读第一章的过程中,整理出来了一些重要的概念. 锁粒度 表锁(服务器实现,忽略存储引擎). 行锁(存储引擎实现,服务器没有实现). 事务的ACID概念 原子性(要么全部成功,要么全部回滚). 一致性 ...
随机推荐
- ASP.NET 5 Beta6发布了(翻译)
感觉就好像我们刚刚发布了一个版本,现在我们又要发布一个新的版本.开发团队通过努力工作在Visual Studio2015的正式版上提交使用ASP.NET 5开发工具的上的更新以及库的更新.新的版本为b ...
- Heap Spray原理
Heap Spray定义基本描述 Heap Spray并没有一个官方的正式定义,毕竟这是漏洞攻击技术的一部分.但是我们可以根据它的特点自己来简单总结一下.Heap Spray是在shellcode的前 ...
- VC++多线程--进程间通信
1.邮槽 邮槽是windows系统提供的一种单向通信的机制,邮槽能传输的数据非常小,一般在400k左右. 创建邮槽 HANDLE CreateMailslot( LPCTSTR lpName, //指 ...
- CUDA,cudnn一些常见版本问题
- 最好的方法是官网说明: https://tensorflow.google.cn/install/source_windows Version Python version Compiler Bu ...
- java学习笔记7--抽象类与抽象方法
接着前面的学习: java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) jav ...
- android学习的网站收集
1. http://mob.com/#/index 提供分享等统一解决方案 2. http://bbs.apkbus.com/explore/ 这个类似的quroa问答模块,覆盖不错.就是人气,稍差. ...
- Linux shell 提取文件名和目录名
${}用于字符串的读取,提取和替换功能,可以使用${} 提取字符串 1.提取文件名 [root@localhost log]# var=/dir1/dir2/file.txt [root@localh ...
- [笔记][Java7并发编程实战手冊]3.8 并发任务间的数据交换Exchanger
[笔记][Java7并发编程实战手冊]系列文件夹 简单介绍 Exchanger 是一个同步辅助类.用于两个并发线程之间在一个同步点进行数据交换. 同意两个线程在某一个点进行数据交换. 本章exchan ...
- STL - vector algorithm
// create vector with elements from 1 to 6 in arbitrary order vector<, , , , , }; // find and pri ...
- bitBucket readme文件图片添加
bitBucket一个和github一样的强大的代码托管站点,前者支持免费无限的私有仓库:后者私有仓库要付费: 在bitbucket项目中可以使用markDown语法创建一个README.md文件,但 ...