等待定时器与用户定时器的区别

等待定时器(SetWaitableTimer)与用户定时器(SetTimer)它们之间的最大差别是,用户定时器需要在应用程序中设置许多附加的用户界面结构,这使定时器变得资源更加密集。

等待定时器属于内核对象,这意味着它们可以供多个线程共享,并且是安全的。

 

用户定时器能够生成WM_TIMER消息,这些消息将返回给调用SetTimer(用于回调定时器)的线程和创建窗口(用于基于窗口的定时器)的线程。因此,当用户定时器报时的时候,只有一个线程得到通知。

 

多个线程可以在等待定时器上进行等待,如果定时器是个人工重置的定时器,则可以调度若干个线程。

如果要执行与用户界面相关的事件,以便对定时器作出响应,那么使用用户定时器来组织代码结构可能更加容易些,因为使用等待定时器时,线程必须既要等待各种消息,又要等待内核对象(如果要改变代码的结构,可以使用MsgaitForMultipleObjects函数)。

 

等待定时器,当到了规定时间的时候,更有可能得到通知。WM_TIMER消息始终属于最低优先级的消息,当线程的队列中没有其他消息时,才检索该消息。等待定时器的处理方法与其他内核对象没有什么差别,如果定时器发出报时信息,而你的线程正在等待之中,那么你的线程就会醒来。

 

用户定时器SetTimer

   
   
   
   
UINT_PTR SetTimer(
HWND hWnd,
// 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT uElapse,               // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);

 

第一种用法 :(vs2008代码下载)

第一个参数hWnd设为NULL,第四个参数设为TimerProc函数指针。

 

第二种用法 :(vs2008代码下载)

第一个参数hWnd不为NULL,第四个参数设为TimerProc设置为空。

 

你可能感兴趣的:(职场,休闲,等待定时器与用户定时器的区别)