Работя върху многонишково win32 MFC приложение. Изобразяваме карта и я показваме в панел в потребителския интерфейс заедно с изобразени по избор обекти отгоре. Изобразява се бавно (~800 ms), което се случва в нишката на потребителския интерфейс.
Опитвам се да преместя изобразяването в собствена нишка, така че менютата да останат бързи, докато другото изобразяване все още може да работи във фонов режим. Нишката 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 и след това го използвам отново и отново? Има ли някакви подходи, които мога да предприема, за да помогна за отстраняване на грешки/коригиране на този проблем?