02_27
shared_ptr
lambda
02_28
自定义消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#define WM_MYMSG (WM_USER + 100) // 申明消息处理函数 afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam); // 添加消息映射函数 BEGIN_MESSAGE_MAP(CTestDlg, CDialog) ON_MESSAGE(WM_MYMSG, OnMyMSG) END_MESSAGE_MAP() // 实现消息函数 LRESULT CTestDlg::OnMyMsg(WPARAM, wParam, LPARAM lParam) { // return 0; } |
自定义系统唯一消息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
static UINT WM_MSG = RegisterWindowMessage("myMsg"); // 申明消息处理函数 afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam); // 添加消息映射函数 BEGIN_MESSAGE_MAP(CTestDlg, CDialog) ON_MESSAGE(WM_MYMSG, OnMyMSG) END_MESSAGE_MAP() // 实现消息函数 LRESULT CTestDlg::OnMyMsg(WPARAM, wParam, LPARAM lParam) { // return 0; } // 需要让很多应用程序接收这个消息 ::SendMessage(HWND_BROADCAST, WM_MSG, NULL, NULL); |
windbg调试
UI库区别
软件卡的分析
- 表现为进程中某个或多个线程卡死,可能是UI主线程,也可能是其他线程。
- UI主线程的话,可能是UI界面无法点击、无法操作
- 其他线程的话可能是相关模块无法正常运转
- 一般线程卡死或阻塞主要是死循环或者死锁导致的
死循环
- 会表现出CPU占用高的现象
- 可能是代码里面循环的退出逻辑不正确,导致无法退出循环
- 还可能是部分消息的产生与处理存在循环
死循环排查
- 死循环一般表现为CPU占用高,一般是发生在某个线程中
- 可以用一些工具,
process explored
或者process hacker
等查看哪个线程占用CPU比较高 - 然后查看对应线程的函数调用堆栈,通过函数调用堆栈判断死循环发生在哪个函数中
死锁
- 一般发生在多个线程之间,涉及两个或两个以上的锁
死锁排查
- 死锁可通过运行日志来排查,也可以通过调试工具来排查
- 分析死锁问题,首先要确定死锁的是哪几个线程,可以查看线程堆栈,如果线程卡在
EnterCriticalSection
或WaitForSingleObject
等函数上,可能是发生死锁的线程 - 用
!locks
查看所有临界区对象- 可以看到临界区内核对象的地址和拥有所有权的线程id
- 切到目标线程
- 查看目标线程的堆栈
- 也可以用
kv
看带参数的线程堆栈,找到内核对象的地址
- 也可以用
- 确定对应线程后,定位发生问题的代码
界面卡死的分析
- 可能是在UI线程读写文件
- 可能是UI线程中用了Sleep
GDI是CPU还是GPU绘制
- 利用CPU进行计算
SendMsg和PostMsg
1 2 3 4 5 6 7 8 9 10 11 12 13 |
LRESULT SendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); BOOL PostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam ); |
- sendmessage是同步的。
postmessage是异步的。 - sendmessage它等待消息被处理完了才返回,如果消息不被处理,发送消息的线程讲一直被阻塞。
postmessage只把消息放入队列,不管消息是否被处理就返回。 - 如果在同一个线程内,sendmessage发送消息时,由USER32.DLL模块调用目标窗口的消息处理程序,并将结果返回。sendmessage在同一线程中发送消息并不入线程消息队列。postmessage发消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口。
- 如果在不同的线程内,sendmessage发送消息到目标窗口所属线程的消息队列,然后发送消息的线程在USER32.DLL模块内监视和等待消息处理,直到目标窗口处理完返回。
本文为原创文章,版权归Aet所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ 2022_02_24_0103/01
- ♥ 2025_03_1103/11
- ♥ 2023_02_0902/11
- ♥ 2019_11_0511/07
- ♥ 2022_03_0703/09
- ♥ 2022_02_2602/26