怎么往settimer的回调函数传递参数

怎么往settimer的回调函数传递参数

ID:13726785

大小:39.00 KB

页数:7页

时间:2018-07-24

怎么往settimer的回调函数传递参数_第1页
怎么往settimer的回调函数传递参数_第2页
怎么往settimer的回调函数传递参数_第3页
怎么往settimer的回调函数传递参数_第4页
怎么往settimer的回调函数传递参数_第5页
资源描述:

《怎么往settimer的回调函数传递参数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、从SetTimer看Windows消息处理机制2010-02-0922:07909人阅读评论(0)收藏举报本文说明两个问题:1.windows的消息处理机制;2.怎么往SetTimer的回调函数传递参数。首先看第一个问题,我们都知道windows是消息驱动的,windows呈现给用户的任何可以看到听到的东西几乎都是消息驱动的,在底层windows为每个线程准备了一个消息队列,如果用户线程注册了某个消息,那么在适当的时候windows就会将消息投递到该线程的消息队列中,然后由该线程取出队列中的消息,然后处理之,这个过程有两个参与者,一个是windows系统

2、,它主要负责投递消息,收不收是用户线程的事,另一个就是用户线程,它主要负责取出消息并处理消息,即使用户线程因为睡眠或者根本就没有设定消息循环,系统还是会投递的,系统和用户线程的消息接口就是消息队列,这就在用户和系统之间关于消息解除了耦合,在用户线程处理消息的时候,其实还有一个消息队列,因为一个线程不一定只接收一种消息而且不一定马上就能处理完并返回,这个消息队列我们把它叫做消息分发队列或者简称分发队列用来与系统的消息队列区分,注意分发队列里面的消息都是已经格式化后的消息,分发给谁呢?当然是分发给消息的回调函数了,对于有窗口的就是先分发给窗口过程,然后由窗口

3、过程分发给具体的处理函数。下面我们来通过一个例子说明一下,用vs2005或VC建立一个Win32工程,然后看自动生成的代码:intAPIENTRY_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnCmdShow){...//主消息循环:while(GetMessage(&msg,NULL,0,0)){if(!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)){TranslateMessage(&msg);Dispat

4、chMessage(&msg);//msg中按照消息号识别}}return(int)msg.wParam;}以上就是消息循环,该线程循环接收消息,然后DispatchMessage消息,Dispatch到窗口过程:LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){intwmId,wmEvent;PAINTSTRUCTps;HDChdc;switch(message)//message就是消息号{caseWM_COMMAND:...default:returnDef

5、WindowProc(hWnd,message,wParam,lParam);}return0;}以上实际上就是windows消息机制的全景,对于windows的timer当然也要套用上面的模式了,在SetTimer调用后,实际上就注册了WM_TIMER消息,以下是函数定义:UINT_PTRSetTimer(HWNDhWnd,UINT_PTRnIDEvent,UINTuElapse,TIMERPROClpTimerFunc);lpTimerFunc就是回调函数,其形式为:VOIDCALLBACKTimerProc(HWNDhwnd,UINTuMsg,UI

6、NT_PTRidEvent,DWORDdwTime);SetTimer的参数uElapse就是时间间隔,比如设置为1000即1秒,现在有了一个问题,请看下列代码:VOIDCALLBACKTimerFunc(HWNDhwnd,UINTuMsg,UINT_PTRidEvent,DWORDdwTime){Sleep(5000);}DWORDCALLBACKAutoBakup(PVOIDlpParam){MSGmsg;UINTid=SetTimer(NULL,1,1000,TimerFunc);BOOLbRet;while(((bRet=GetMessage(&

7、msg,NULL,0,0))!=0)){if(bRet==-1){break;}else{TranslateMessage(&msg);DispatchMessage(&msg);}}KillTimer(NULL,id);return0;}竟然在timer的处理函数中睡眠了,那么SetTimer时的1000毫秒触发一次timer回调还会进行吗?其实不会进行了,本质上那个1000毫秒就不是说触发回调函数的间隔,而是产生WM_TIMER消息的间隔,因为回调函数中睡眠了,所以也就阻塞了本线程,这个线程就不再往前走了,但是底层的WM_TIMER消息也会因此而不再

8、投递吗?不会,消息的投递其实不是本线程进行的,而是系统进行的,本线程已经睡眠了,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。