浅尝《Windows核心编程》之 内核对象

1.       内核对象

内核对象主要要用来供系统和应用程序管理系统资源,像进程、线程、文件等。存取符号对象、事件对象、文件对象、作业对象、互斥对象、管道对象、等待计时器对象等都是内核对象。内核对象由内核拥有,并不是进程所拥有。

具体可以参见这位大哥的文章

http://www.cnblogs.com/xuyuan77/archive/2008/04/23/1167623.html

 

2.       通知

当内核对象得到通知时,其状态变为“已通知”,否则就是“未通知”。当线程等待的对象处于“为通知”状态下,线程不可调度,否则为可调度。

 

3.       各个内核对象的内核对象和线程同步之间的关系

 

 

4.       几种常用的内核对象介绍

(1)       进程(略)

(2)       线程(略)

(3)       事件(EVENT

      1. 创建

HANDLE WINAPI CreateEvent(
  __in_opt  LPSECURITY_ATTRIBUTES lpEventAttributes,
  __in      BOOL bManualReset,
  __in      BOOL bInitialState,
  __in_opt  LPCTSTR lpName);
 

  通常第一参数和第四参数设为NULL。
  第二参数表示是否要人工重置。人工重置和自动重置的区别如下:当人工重置的时间得
到通知时,等待该时间的所有线程均变成可调度线程,当一个自动重置的时间得到通知时,
等待该时间的线程中只有一个线程变为可调度线程(因为os对线程的调度而随机选择)。其
中的实质就是Microsoft为自动重置的时间定义了应该成功等待的副作用规则,即当线程成功
地等待到该对象时(意思是一个等待的线程因为得到通知状态而被激活),自动重置的事件
就会自动重置到未通知状态(其他等待这个事件的线程又被挂起了)。
  第三参数为初始状态,false表示未通知状态,true表示通知状态。

 2. 修改状态

动态改为通知状态的函数为SetEvent(),动态改为未通知状态的函数是ResetEvent().

 

 3. 关闭事件

CloseHandle()

 

 (4)     等待定时器

几个例子,见《Windows核心编程》第六章P204

    等待计时器和定时器的区别

 

    最后要说明的是,凡是称职的 Wi n d o w s编程员都会立即将等待定时器与用户定时器(用S e t Ti m e r函数进行设置)进行比较。它们之间的最大差别是,用户定时器需要在应用程序中设置许多附加的用户界面结构,这使定时器变得资源更加密集。另外,等待定时器属于内核对象,这意味着它们可以供多个线程共享,并且是安全的。

    用户定时器能够生成W M _ T I M E R消息,这些消息将返回给调用 S e t Ti m e r(用于回调定时器)的线程和创建窗口(用于基于窗口的定时器)的线程。因此,当用户定时器报时的时候,只有一个线程得到通知。另一方面,多个线程可以在等待定时器上进行等待,如果定时器是个人工重置的定时器,则可以调度若干个线程。

    如果要执行与用户界面相关的事件,以便对定时器作出响应,那么使用用户定时器来组织代码结构可能更加容易些,因为使用等待定时器时,线程必须既要等待各种消息,又要等待内核对象(如果要改变代码的结构,可以使用 M s g Wa i t F o r M u l t i p l e O b j e c t s函数)。最后,运用等待定时器,当到了规定时间的时候,更有可能得到通知。

           W M _ T I M E R消息始终属于最低优先级的消息,当线程的队列中没有其他消息时,才检索该消息。等待定时器的处理方法与其他内核对象没有什么差别,如果定时器发出报时信息,而你的线程正在等待之中,那么你的线程就会醒来。

 

 

posted @ 2009-06-11 11:37  aicro  阅读(464)  评论(0编辑  收藏  举报