处理UI卡死的技巧
背景:处理win32以消息循环机制的进程
问题:UI卡死
卡死的原因
- UI线程处理了阻塞耗时的业务,导致UI加载不过来
- 异步线程处理了UI业务,导致莫名其妙的UI现象甚至崩溃
- 消息处理函数里面 弹模态框,UI卡死转圈
解决方案
首先,我们要了解到一个基本概念,就是win32以消息循环机制运行的程序,UI线程是包括消息处理函数的,所以所有耗时的操作不能放到这里面来。
SendMessage是阻塞的,PostMessage是非阻塞的。
针对上述问题,我们来谈一下解决方案:
- 分离业务操作和UI操作,耗时业务启用新线程来处理,UI的操作在主线程
- 如果异步里面要操作UI,发消息主线程,然后在消息处理函数里面处理UI操作
- 模态框也是阻塞的,要把业务操作和弹窗分离开来,保证业务操作的消息能立马执行完毕不被阻塞,弹窗单独发消息处理。 原理就是:父窗口的一个消息处理未返回,那么弹出的模态框暂时不能接替父窗口的消息循环,导致父窗口一直处于响应状态,直到子窗口被激活(鼠标放上去等操作)模态状态才真正生效。