【整理】Windows 定时器 与自定消息

记录

昨天写代码,没怎么注意。把自己绕了很久。写windows的 还是要多深入了解windows系统底层。

很简单,其实就是定时器清空内存,开线程。线程发消息写内存。

Created with Raphaël 2.1.0 定时器 定时器 线程 线程 清空 开启 线程写入内存 完毕 开启

(第一次用这个画图,觉得不错)
就想用什么办法去达到互斥,CS EVENT都试过了。
搜索到一个以前的帖子,觉得应该是消息方面的问题。
结果调试一看,在接收消息的时候,压根就不会进入定时器消息。

消息

查了下资料;
定时器消息属于队列消息,我自己创建的消息属于非队列消息。
底层的逻辑windows已经处理好了,我们看来这些消息是以有序、同步的方式到来。
上面的意思大概是,在窗口过程处理某一消息的过程中,程序不糊被其他消息突然中断。

windows程序设计上说,虽然windws程序可有多个执行线程,但每个线程的消息队列仅为那些其窗口过程在该线程内执行的窗口进行消息处理。换言之,消息循环和窗口过程不是并发运行的,当一个消息循环从其自身的消息队列中检索消息,并调用DispatchMessage函数将检索到的消息发送给窗口过程时,只有在窗口过程将控制权返还给Windows后,DispatchMessage才会返回。

这个博文关于消息的优先级;
文中说:WM_TIMER消息的优先级最低,所以在有其他消息的情况下,WM_TIMER消息得不到处理,这也是我以前使用SetTimer注册一个回调函数,而回调函数一直未被调用的原因。因为我在UI环境中使用,处理WM_PAINT消息时又触发了界面的重绘,导致了始终有WM_PAINT消息要处理,WM_TIMER于是得不到处理的机会。处理WM_PAINT消息时要小心,不然程序就可能消耗很高的cpu,并且使得低于WM_PAINT优先级的WM_TIMER得不到处理。

而我这块发送的消息好像也是优先处理,然后再处理定时器消息。
再记录;

你可能感兴趣的:(C++)