Cześć, od niedawna bawię się w WinApi w C++ i mam do was takie pytanie:
Przeczytałem, że kontekst urządzenia należy bezwzględnie zwalniać zaraz po jego wykorzystaniu. Nawet jeśli często z niego korzystamy to należy go za każdym razem ładować i zwalniać...
No i zastanawiam się dlaczego i czy jest w tym sens? Jedyną odpowiedź, którą udało mi się znaleźć, na pytanie dlaczego tak, to taka, że kontekstów urządzenia jest ograniczona ilość i szybko mogą się skończyć.
Zastanawiam się jednak czy da się jakoś sprawdzić (oszacować) ile takich kontekstów urządzenia jest u mnie na komputerze do dyspozycji?
Czy są jakieś inne wady, gdybym chciał zainicjować taką strukturę np. globalnie -> załadować kontekst zaraz po utworzeniu okna -> i zwolnić go tuż przed zakończeniem programu?
W zasadzie to planowałem taki kontekst dać w mojej klasie Window i wówczas każde okno miałoby swój własny kontekst... Do tego w konstruktorze byłby on ładowany a w destruktorze zwalniany, co rozwiązałoby problem martwienia się w tym zakresie ;-).
Co wy na to?
0
2
Pytanie: dlaczego chcesz walczyć z Windowsem, który został zaprojektowany tak a nie inaczej, i próba obejścia tego może się skończyć tylko na twoją niekorzyść? (wyciekiem zasobów albo zmuleniem systemu)
Jeśli wywołasz RegisterClass
z flagą CS_OWNDC
, to okno będzie miało przydzielony swój własny kontekst (GetDC
zwróci zawsze ten sam uchwyt, a ReleaseDC
na nim nic nie zrobi). Ale używa się tego głównie do OpenGL...
Nie kombinuj. Rób tak jak każą: GetDC kiedy potrzebujesz i ReleaseDC kiedy skończysz.
W C++ możesz to sobie opakować w klasę:
{
MyDC dc(hwnd); // GetDC w konstruktorze
...
// ReleaseDC w destruktorze
}
ale nie zastanawiałem się czy to będzie dobry pomysł.
0
Może i masz rację ;-)
Co do opakowania w klasę to również o tym myślałem i chyba właśnie tak zrobię.
dzięki.