Я работаю над многопоточным приложением Win32 MFC. Мы визуализируем карту и отображаем ее на панели в пользовательском интерфейсе вместе с настраиваемыми объектами наверху. Рендеринг выполняется медленно (~ 800 мс), что происходит в потоке пользовательского интерфейса.
Я пытаюсь переместить рендеринг в отдельный поток, чтобы меню оставались быстрыми, в то время как другой рендеринг мог работать в фоновом режиме. Поток Draw будет непрерывно отображать, используя собственный CDC. Поток пользовательского интерфейса вызовет функцию перерисовки, которая блокирует мьютекс, берет последний снимок CBitmap
и рисует его с помощью CDC
пользовательского интерфейса. Каждое место, где используется CD
C потока Draw, блокируется мьютексом.
Я вижу, что поток создает новый CBitmap
через CreatCompatibleBitmap
, а затем пытается выбрать новый объект CBitmap
в CDC
потока Draw.
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);
На этом этапе произошла ошибка ASSERT отладки в CGdiObject :: FromHandle ().
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, а затем использую его снова и снова? Есть ли какие-либо подходы, которые я могу предпринять, чтобы помочь отладить / решить эту проблему?