众所周知,windows窗口程序是基于消息的,其最底层维护者一个死循环如下:
while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0) { if (bRet == -1) { // handle the error and possibly exit } else { TranslateMessage(&msg); DispatchMessage(&msg); } }
该循环不断从消息队列中取消息进行处理。每次调用GetMessage从消息队列取一条消息,且是按照如下优先级取消息:
- Sent messages
- Posted messages
- Input (hardware) messages and system internal events
- Sent messages (again)
- WM_PAINT messages
- WM_TIMER messages
只要优先级更高的消息,优先级低的消息就只能等优先级高的消息处理完毕后才能得到处理。
另外,如果使用没有明确另启动一个线程处理事务的情况下,wdinsows程序只有一个主线程,所有的处理只能排队处理,如果某个消息处理时触发了其他需要等待的消息,就会造成消息死锁。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探