gpt4 book ai didi

c++ - ASSERT 在 CDC SelectObject() 调用上失败 - 我可以尝试什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:54 25 4
gpt4 key购买 nike

我正在开发多线程 win32 MFC 应用程序。我们正在渲染 map 并将其显示在用户界面的 Pane 中,并在顶部显示自定义渲染的对象。呈现速度很慢(~800 毫秒),这是在用户界面线程上发生的。

我试图将渲染移动到它自己的线程上,以便菜单仍然保持活泼,而另一个渲染仍然可以在后台运行。 Draw 线程将使用自己的 CDC 不断渲染。 UI 线程将调用重绘函数,该函数锁定互斥锁,并获取 CBitmap 的最后快照并使用 UI 的 CDC 绘制它。使用 Draw 线程的 CDC 的每个位置都被互斥锁锁定。

我看到的是线程通过 CreatCompatibleBitmap 创建一个新的 CBitmap,然后尝试选择新的 CBitmap 对象到绘制线程的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() 中出现调试 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 方法返回错误的对象?我为 Draw 线程创建 CDC 然后反复使用它的方式是否存在根本性缺陷?我可以采取任何方法来帮助调试/修复此问题吗?

最佳答案

金色。句柄和对象之间的映射在 thread-local storage 中.

In a multi-threaded environment because windows are owned by threads, MFC keeps the temporary and permanent window handle map in thread local storage. The same is true for other handle maps like those for GDI objects and device contexts. Keeping the window handle maps in thread local storage ensures protection against simultaneous access by several threads.

基本上,存储句柄,然后从句柄创建一个 CBitmap,以便在线程之间操作它们。

我的错误在于 UI 线程创建我的 CBitmap,然后从两个线程访问 CBitmap 对象。

关于c++ - ASSERT 在 CDC SelectObject() 调用上失败 - 我可以尝试什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579154/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com