客户端卡死案例分析

问题

界面卡死,用户发送过来dump

01 00e9e258 61fe227b 125f5ee0 00e9e288 45d011ea ucrtbase!_chmod+0x671
通过FindFirstFile FindNextFile等API获取某个目录下文件所占用的大小
*** WARNING: Unable to verify checksum for DuiLib.dll
07 00e9ebc0 65413191 3876cf71 14cbe790 00000000 xxx::InitWindow+0x5e1
08 00e9f0a0 654129cb 00000001 00000000 00e9f290 DuiLib!DuiLib::WindowImplBase::OnCreate+0x439
09 00e9f0cc 61fdf9c1 00000001 00000000 00e9f290 DuiLib!DuiLib::WindowImplBase::HandleMessage+0xda
0b 00e9f10c 754762fa 000501e2 00000001 00000000 DuiLib!DuiLib::CWindowWnd::__WndProc+0x38
0c 00e9f138 75477316 65421397 000501e2 00000001 user32!InternalCallWinProc+0x23
0d 00e9f1b0 75476de8 00000000 65421397 000501e2 user32!UserCallWinProcCheckWow+0xd8
0e 00e9f20c 7547a748 015395b0 00000000 00000001 user32!DispatchClientMessage+0xd5
0f 00e9f24c 7784013a 00e9f264 00000000 00e9f754 user32!__fnINLPCREATESTRUCT+0x91
10 00e9f578 7547aa44 00000010 00e9f5e4 00e9f614 ntdll+0x1013a
11 00e9f62c 75478a5c 00000010 6202ac68 00e9f614 user32!_CreateWindowEx+0x210
12 00e9f668 654206ba 00000010 6202ac68 62022378 user32!CreateWindowExW+0x33

原因

在UI线程中使用了遍历目录中所有文件,并且获取文件大小的操作。也就是说在UI线程执行了IO相关的操作。

解决方案

在非UI线程中遍历目录,取到文件大小,然后通知UI线程结果。

总结

切记在UI线程中不要做IO操作或CPU密集型的计算。需要放到单独的线程中。

原文地址:https://www.cnblogs.com/1yzq/p/12918028.html