Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343035
  • 博文数量: 82
  • 博客积分: 3353
  • 博客等级: 中校
  • 技术积分: 742
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-20 19:13
文章分类

全部博文(82)

文章存档

2015年(1)

2014年(1)

2013年(1)

2012年(12)

2011年(3)

2010年(25)

2009年(37)

2008年(2)

我的朋友

分类: C/C++

2012-03-21 09:40:33

  Windows程序运行的本质:Message based, Event driven.(以消息为基础,以事件驱动之)。
  学习MFC的必要基础:
 1. 对于Windows程序的事件驱动特性的了解(消息的产生、获得、分派、判断、处理);
 2.C++多态的精确体会;

一、Windows程序调用的函数分为:
      1. C Runtimes 函数库:
分静态链接和动态链接版本;
分单线程和多线程版本;
分Debug和Release版本;
      2. Windows API:
GDI32.DLL, USER32.DLL, KERNEL32.DLL.

二、以消息为基础,以事件驱动之
Event 产生消息,消息触发Action.
        1).由硬件产生的消息,放在系统队列中,由Windows系统或者程序传送的消息,放在程序队列中;
2).调用GetMessage API取得一个消息(程序的生命靠它来推动);
3).TranslateMessage 转换键盘消息;
4).DispatchMessage 分派消息,通过USER Module的帮助,调到call back函数(窗口函数,每个窗口负责
处理消息的函数,是窗口的生命中枢),进一步处理消息;
while(GetMessage ){
TranslateMessage 
DispatchMessage 
}

1.MFC中使用了消息映射(Message Map)来触发消息响应函数。
2.PostMessage和SendMessage的区别:
1).PostMessage是将消息放进程序队列中,等待被处理;
2).SendMessage是直接通过USER Module的帮助,调到call back函数;

3.PeekMessage和GetMessage的区别:
   如果消息队列中没有消息,线程会挂起,再次照顾到次线程的时候,如果消息队列中还是没有消
息,两者行为不同:
1).GetMessage会获得控制权,使程序得以执行一段时间;
2).PeekMessage会过门而不入,于是系统会去照顾其他人。

4.程序的退出过程(比如按下菜单中的Close):
1).系统送出WM_CLOSE,通常不被窗口函数处理,DefWindowProc处理它;
2).DefWindowProc会调用DestroyWindow清除窗口,并送出WM_DESTROY;
3).窗口函数调用PostQuitMessage响应WM_DESTROY,只是送出WM_QUIT消息;
4).GetMessage取得消息WM_QUIT后,会退出while循环,程序退出;


三、进程和线程
线程是CPU的调度单位。
内核对象区别于普通对象的标志是:创建对象的时候是否有安全属性参数设置。
SECURITY_ATTRIBUTES,可设置安全属性和继承特性。
进程创建的时候,会自动创建一个主线程。
每个进程都有自己的内核对象表,表项可以被继承、拷贝,从而达到不同进程间共享的目的。
内核对象可以命名,如此可以在其他进程中打开该命名对象,也能实现共享。
创建线程的时候应该调用_beginhtreadx,而不是CreateThread。_beginhtreadx有其他针对平台的特有操作。
线程可以和CPU设置相关性,即设定某个线程只运行在某个CPU上,但是这样比较危险。
每个进程有自己独立的地址空间,每个线程有自己的堆栈(stack),线程还有自己的堆(Heap)。可以根据需要申请多个不同的堆。
阅读(941) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~