快乐de小跳蛙 2021-05-25 15:23 采纳率: 50%
浏览 83
已采纳

VC++程序DEBUG调试时触发一个断点

最近刚接触MFC,在调试项目的时候,点击退出时总会触发一个断点,如果直接运行exe(无论是debug还是release)都没有问题。

 


设置断点发现是在GdiplusShutdown(m_pGdiToken);处触发的的断点。

basic::basic()
	{
		GdiplusStartup(&m_pGdiToken, &m_gdiplusStartupInput, NULL);
	}
	basic::~basic()
	{
		GdiplusShutdown(m_pGdiToken);
	}

查看相关代码始终没有找到,触发断点原因,相关代码如下:
 

bool ui::img_from_res(UINT nID, LPCTSTR sTR, Image * &pImg)
    {
        HINSTANCE hInst = AfxGetResourceHandle();
        HRSRC hRsrc = ::FindResource (hInst, MAKEINTRESOURCE(nID), sTR); // type
        if (!hRsrc)
            return false;
        // load resource into memory
        DWORD len = SizeofResource(hInst, hRsrc);
        BYTE* lpRsrc = (BYTE*)LoadResource(hInst, hRsrc);
        if (!lpRsrc)
            return false;
        // Allocate global memory on which to create stream
        HGLOBAL m_hMem = GlobalAlloc(GMEM_FIXED, len);
        BYTE* pmem = (BYTE*)GlobalLock(m_hMem);
        memcpy(pmem,lpRsrc,len);
        IStream* pstm;
        CreateStreamOnHGlobal(m_hMem,FALSE,&pstm);
        // load from stream
        pImg = Gdiplus::Image::FromStream(pstm);
        // free/release stuff
        GlobalUnlock(m_hMem);
        pstm->Release();
        FreeResource(lpRsrc);
        return true;
    }
DWORD ui::gifproc(LPVOID lpParam)
    {
        Image *img = (Image *)lpParam;
        UINT  nCount = img->GetFrameDimensionsCount();
        GUID* pDimensionsIDs = (GUID*)new GUID[nCount];
        img->GetFrameDimensionsList(pDimensionsIDs,nCount);
        wchar_t strGUID[39]={0};
        StringFromGUID2(pDimensionsIDs[0], strGUID, 39);
        UINT nFrameCount = img->GetFrameCount(&pDimensionsIDs[0]);
        delete[] pDimensionsIDs;
        
        int size = img->GetPropertyItemSize(PropertyTagFrameDelay);
        byte *p  = new byte[size];
        PropertyItem*  pItem = (PropertyItem*)p;
        img->GetPropertyItem(PropertyTagFrameDelay,size, pItem);
        
        int  fcount = 0;
        GUID guid  = FrameDimensionTime;
        HDC hDC = ::GetDC(m_gifwnd);
        Graphics gc(hDC);

        RECT rect = {0};
        GetClientRect(m_gifwnd, &rect);
        int x = (rect.right  - img->GetWidth()) / 2;
        int y = (rect.bottom - img->GetHeight()) / 2;

        while (m_gifruning)
        {            
            gc.DrawImage(img, x, y, img->GetWidth(), img->GetHeight());            
            img->SelectActiveFrame(&guid, fcount++);
            if (fcount == nFrameCount)
            {
                fcount = 0;
            }
            //long pause = ((long*)pItem->value)[fcount];
            //Sleep(pause);
        }
        ::ReleaseDC(m_gifwnd, hDC);
        delete []p;
        return 0;
    }
void ui::bitmap_ex(HDC hDC, HBITMAP hbitmap, int x, int y, int w, int h, int hv)
    {
        if (hDC != NULL && hbitmap != NULL)
        {
            if (hv == 0)
            {
                BITMAP bmp;            
                HDC hMM = CreateCompatibleDC(hDC);        
                GetObject(hbitmap, sizeof(BITMAP), &bmp);
                SelectObject(hMM, hbitmap);
                SetStretchBltMode(hDC, HALFTONE);
                StretchBlt(hDC, x, y, w, h, hMM, 0, 0, bmp.bmWidth, bmp.bmHeight, SRCCOPY);            
                DeleteObject(hbitmap);
                DeleteObject(hMM);
            }
            else
            {
                Graphics gr(hDC);
                Bitmap bitmap(hbitmap, NULL);
                if (hv == 1)
                {
                    Point HoPoints[] = {Point(x + w, y), Point(x, y), Point(x + w, y + h)};
                    gr.DrawImage(&bitmap, HoPoints, 3);
                }        
                else if (hv == 2)
                {
                    Point VePoints[] = {Point(x, y + h), Point(x + w, y + h), Point(x, y)};
                    gr.DrawImage(&bitmap, VePoints, 3);
                }
            }
        }
    }

求大神指点一下。

  • 写回答

4条回答 默认 最新

  • CSDN专家-link 2021-05-25 15:28
    关注

    主程序退出前,确保子线程已经退出。否则可能存在资源冲突,比如主线程退出了,资源释放了,但子线程还在使用该资源

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 MATLAB APP 制作出现问题
  • ¥15 wannier复现图像时berry曲率极值点与高对称点严重偏移
  • ¥15 利用决策森林为什么会出现这样·的问题(关键词-情感分析)
  • ¥15 DispatcherServlet.noHandlerFound No mapping found for HTTP request with URI[/untitled30_war_e
  • ¥15 使用deepspeed训练,发现想要训练的参数没有梯度
  • ¥15 寻找一块做为智能割草机的驱动板(标签-stm32|关键词-m3)
  • ¥15 信息管理系统的查找和排序
  • ¥15 基于STM32,电机驱动模块为L298N,四路运放电磁传感器,三轮智能小车电磁组电磁循迹(两个电机,一个万向轮),怎么用读取的电磁传感器信号表示小车所在的位置
  • ¥15 如何解决y_true和y_predict数据类型不匹配的问题(相关搜索:机器学习)
  • ¥15 PB中矩阵文本型数据的总计问题。