RT,windows是把所有的timer都挂在一个队列上,然后在指定的时钟周期对队列上的所有timer进行 “--”操作?
如果这样的话时钟中断的延迟会不会因为timer数量的增大而增大?

解决方案 »

  1.   

    开源码,就是调用API的settimer
      

  2.   

    SetTimer
    至于原理性的操作,楼主参考下计算机组成原理吧
    timer原本就是通过消息处理的,消息队列
      

  3.   

    timer本来就不是精准定时的。延误再正常不过了
      

  4.   

    SetTimer 。线程里都是用这个。
      

  5.   


    我的意思是SetTimer在window中怎么实现的。。
      

  6.   


    win32k中有一个全局变量gptmrFirst,里面存放了第一个定时器结构的指针,定时器结构以链表的形式储存
    线程在消息循环中会调用GetMessageW->NtUserGetMessage->xxxInternalGetMessage->xxxRealInternalGetMessage
    xxxRealInternalGetMessage后面会调用DoTimer,DoTimer就遍历整个定时器链表,并比较每个Timer的Win32Thread指针是不是于win32k的全局变量gptiCurrent,gptiCurrent中保存的是当前线程的Win32Thread结构的指针(许多win32k函数开头都会有EnterCrit,这里面就设置gptiCurrent为PsGetThreadWin32Thread的返回值)
    如果是,表明这个Timer属于当前线程,所以就检查Timer是否已就绪(到时),如果就绪,则调用StoreQMessage放置一个WM_TIMER或WM_SYSTIMER消息,后面xxxRealInternalGetMessage会将其取回csrss.exe进程有一个叫raw input thread的内核线程,其内核对象地址的地址放在win32k全局变量gptiRit中
    这个线程负责处理键盘输入,鼠标输入等,当然也有定时器,它会使用KeWaitForMultipleObjects等待一组内核对象,其中就有主定时器,如果主定时器到时,就执行TimerProc
    TimerProc函数会遍历gptmrFirst链表,减少每个定时器的剩余时间,并把到期的定时器设置为已就绪SetTimer(NtUserSetTimer)->_SetTimer->InternalSetTimer干的事就是将新的定时器结构加入那个链表,或者移除、修改,并设置gptmrMaster强制raw input thread扫描定时器,这个全局变量存放的是主定时器对象的地址
      

  7.   


    Windows核心编程上面有这样类似的介绍没?
      

  8.   

    没,Windows核心编程是教你怎么用api的,不是告诉你api的实现的
      

  9.   

    Timer是往各个消息队列发送Timer消息。
    windows只管向应用程序发消息,不等待处理完成的。
      

  10.   

    win32k!DoTimer+0x18:
    bf80286c f6462401        test    byte ptr [esi+24h],1
    bf802870 7505            jne     win32k!DoTimer+0x1e (bf802877)
    这一步是干嘛的呢 第一个 定时器结构的指针
    第一个定时器结构 的指针
    第一个 定时器结构 的指针
    如何理解?