我正在开发一个多线程的 win32 MFC 应用程序。我们正在渲染地图并将其与顶部的自定义渲染对象一起显示在用户界面的窗格中。渲染速度很慢(~800 毫秒),这发生在用户界面线程上。
我正在尝试将渲染移动到它自己的线程上,以便菜单仍然保持活泼,而其他渲染仍然可以在后台运行。Draw 线程将使用它自己的 CDC 持续渲染。UI 线程将调用重绘函数,该函数锁定互斥体,并获取最后一个快照CBitmap
并使用 UI 的CDC
. 使用 Draw 线程的 C 的每个位置CD
都被互斥锁锁定。
我看到的是线程创建了一个新的CBitmap
via CreatCompatibleBitmap
,然后尝试将新CBitmap
对象选择到 Draw 线程的CDC
.
this->m_canvas.CreateCompatibleDC(&compatibleDC);
this->m_bitmap = new CBitmap();
this->m_bitmap->CreateCompatibleBitmap(&compatibleDC, m_width, m_height);
m_oldBitmap = this->m_canvas.SelectObject(m_bitmap);
此时在CGdiObject::FromHandle()中出现debug ASSERT失败。
CGdiObject* PASCAL CGdiObject::FromHandle(HGDIOBJ h)
{
CHandleMap* pMap = afxMapHGDIOBJ(TRUE); //create map if not exist
ASSERT(pMap != NULL);
CGdiObject* pObject = (CGdiObject*)pMap->FromHandle(h);
ASSERT(pObject == NULL || pObject->m_hObject == h);
return pObject;
}
第二个ASSERT
失败是因为与m_hObject
传入的句柄不匹配。基本上,MFC 正在获取句柄,并进行查找以获取与刚刚创建的CBitmap
对象不匹配的对象。CBitmap
这听起来很熟悉吗?会发生什么导致该FromHandle
方法返回错误的对象?我CDC
为 Draw 线程创建一个,然后一遍又一遍地重复使用它的方式是否存在根本缺陷?有什么方法可以帮助调试/解决这个问题吗?