问题:软件操作一会就会卡死,有时切换到桌面再切换回程序也卡死。

刚开始以为是主线程被阻塞,但感觉又不像。界面灰色,但是按钮对应的事件仍响应。看到网上有人说GDI对象泄漏也可能导致界面卡死。

程序有GDI对象泄漏,导致界面卡死。

对于这种情况。通过任务管理器的GDI数据可以发现问题。

(1)Win7系统下首先任务管理器的【查看】->【选择列】出现如下的界面,选择GDI对象。这样在任务管理器中就可以看到进程的GDI对象数目了。如果GDI对象数达到千数量级,那么很有可能是这个原因。

(2)Win10系统

任务管理器的【详细信息】空白位置右击,选择【选择列】,然后勾选【GDI】对象

运行程序,果然GDI对象增长比较快,在GDI对象数量为10000的时候不在增长,界面卡死。

百度了下:有人说GDI对象的最大值默认为10000,这下确认的问题的根源。

注释掉程序中的构造和初始化程序,运行程序依然存在GDI泄露的情况。

最后想只有消息的问题了,进入代码:

BOOL CSPICalibrationDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO:  在此添加专用代码和/或调用基类
    if (pMsg->message == WM_MBUTTONDBLCLK)
    {
        POINT     ptTmp;
        GetCursorPos(&ptTmp);//获取鼠标位置 
        CRect   Rect;
        CRect   rcPIC;
        CWnd*  pPICWnd = GetDlgItem(IDC_STATIC_RESIMG);
        CDC    *pDCPIC = pPICWnd->GetDC();
        memset(Rect, 0, sizeof(CRect));
        pPICWnd->ClientToScreen(Rect);

 }

发现   CDC    *pDCPIC = pPICWnd->GetDC();

CDC的指针没有被释放。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐