PeekMessage

来源:互联网 发布:mysql 防止重复update 编辑:程序博客网 时间:2024/04/28 22:15
这是个带有Window的线程比较常用的等待一段时间的做法。从这个函数的名字,很明显,这个线程想歇段时间。最简单的方法当然是Sleep(milliseconds);但是这回阻塞这个Thread的Message Queue的Enque。如果别的程序或者线程向这个Thread发个Message,就死等了。比如一个简单的GetWindowText就不动了,你如果用Task Manager看,这个窗口就会显示(No response - 没有反应),所以歇的时候一定不能堵住SendMessage。

举个不恰当的例子,你的Thread是收发室老头儿,老头儿的任务就是接受信件(GetMessage),然后立即送出(DispatchMessage)。邮递员不停地来送信(SendMessage), 你这个函数,老头决定休息一会儿,不送信了(DispatchMessage),但是不能让邮递员干等,人还要干别的事情。所以老头还是瞄了一眼有没有邮递员(PeekMessage),有的话就把信拿到收发室里。 这样邮递员就走了,信留在收发室(Message Queue)。这时候因为不想送信(DispatchMessage),所以一定不能把信给扔了(PM_NOREMOVE),否则信丢了。

等老头休息完了,就可以把信从收发室拿出来(GetMessage),再Dispatch出去。

所以PeekMessage如果后面没有紧跟DispatchMessage, 一定得用PM_NOREMOVE(除非老头儿想过滤,比如把骚扰的信扔了).

你们怎么不看书呢,
windows核心编程上面讲的很详细呀


      
原创粉丝点击