windows 的timer是怎么实现的 RT,windows是把所有的timer都挂在一个队列上,然后在指定的时钟周期对队列上的所有timer进行 “--”操作?如果这样的话时钟中断的延迟会不会因为timer数量的增大而增大? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 开源码,就是调用API的settimer SetTimer至于原理性的操作,楼主参考下计算机组成原理吧timer原本就是通过消息处理的,消息队列 timer本来就不是精准定时的。延误再正常不过了 SetTimer 。线程里都是用这个。 我的意思是SetTimer在window中怎么实现的。。 win32k中有一个全局变量gptmrFirst,里面存放了第一个定时器结构的指针,定时器结构以链表的形式储存线程在消息循环中会调用GetMessageW->NtUserGetMessage->xxxInternalGetMessage->xxxRealInternalGetMessagexxxRealInternalGetMessage后面会调用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等待一组内核对象,其中就有主定时器,如果主定时器到时,就执行TimerProcTimerProc函数会遍历gptmrFirst链表,减少每个定时器的剩余时间,并把到期的定时器设置为已就绪SetTimer(NtUserSetTimer)->_SetTimer->InternalSetTimer干的事就是将新的定时器结构加入那个链表,或者移除、修改,并设置gptmrMaster强制raw input thread扫描定时器,这个全局变量存放的是主定时器对象的地址 Windows核心编程上面有这样类似的介绍没? 没,Windows核心编程是教你怎么用api的,不是告诉你api的实现的 Timer是往各个消息队列发送Timer消息。windows只管向应用程序发消息,不等待处理完成的。 win32k!DoTimer+0x18:bf80286c f6462401 test byte ptr [esi+24h],1bf802870 7505 jne win32k!DoTimer+0x1e (bf802877)这一步是干嘛的呢 第一个 定时器结构的指针第一个定时器结构 的指针第一个 定时器结构 的指针如何理解? 怎么实现类似FLASHGET的当鼠标在网页的某一链接上单击右键的时候,出现"使用FLASHGET下载"的效果 怎样将MessageDlg界面全中文化? delphi8什么时间出啊? 如何保存到数据库表 大家最近保重了!!!!SARS!!!!Kill you!!!! 高手的前进道路 请教关于检测INI文件! 关于数据备份的问题? 时间查询?那位高手帮帮我?? 怎样在form上放一个能跟随form而改变大小的edit控件? delphi BlockRead 是如何读取的啊? 这样的输入输面怎么做?
至于原理性的操作,楼主参考下计算机组成原理吧
timer原本就是通过消息处理的,消息队列
我的意思是SetTimer在window中怎么实现的。。
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扫描定时器,这个全局变量存放的是主定时器对象的地址
Windows核心编程上面有这样类似的介绍没?
windows只管向应用程序发消息,不等待处理完成的。
bf80286c f6462401 test byte ptr [esi+24h],1
bf802870 7505 jne win32k!DoTimer+0x1e (bf802877)
这一步是干嘛的呢 第一个 定时器结构的指针
第一个定时器结构 的指针
第一个 定时器结构 的指针
如何理解?