Lebenszeit von GDI Objekten



  • Ich habe hier ein Custom TabControl in dem ich komplett alles selbst zeichne (ownerdraw / ControlStyles.UserPaint). Ist es sinnvoller...
    a) Die benötigten GDI Objekte (jede Menge Brushes, Pens, Fonts) als Klassenmember zu halten und bei Zerstören des TabControls freizugeben, oder
    b) Bei jedem Paint Aufruf neu zu erzeugen und gleich wieder freizugeben (Dispose) ? 😕
    Eigentlich würde ich zu a) tendieren weil ich das Zeug sowieso bei jedem Paint brauche, aber man hört ja immer "unter C# macht man das nicht so, mach dir temporäre Objekte, wegen den Handles etc usw". Kann das jemand erklären/begründen?


  • Administrator

    Freigeben auf jedenfall! Das hat hier nichts mit C# zu tun, sondern ist wegen GDI.
    Du belegst nämlich Systemressourcen, welche von allen Applikationen geteilt werden und nicht unendlich vorhanden sind. Es gibt da zum Teil sehr harte Grenze bereits schon sehr früh. Speichere daher nie Handles zu GDI Objekten über den Benutzungsraum hinaus, also im allgemeinen ausserhalb des Paint Events.

    Grüssli



  • Gilt das auch für Image Objekte und sowas? Ich kann ja unmöglich ständig Bilder nachladen nur um Handles zu sparen 😕


  • Administrator

    Cpp_Junky schrieb:

    Gilt das auch für Image Objekte und sowas? Ich kann ja unmöglich ständig Bilder nachladen nur um Handles zu sparen 😕

    Ich muss zugeben, ich weiss nicht, wie es um Bitmaps steht. Mir ist nur sehr bewusst, dass es eine maximale Anzahl an Handles pro Process für GDI Objekte gibt. Es waren früher mal 10'000, aber die hat man einfacher erreicht, als man so denkt.

    Ich bin vor 6 Jahren, als ich noch relativ neu hier im Forum war, in dieses Problem reingelaufen:
    http://www.c-plusplus.net/forum/132831

    Fonts, Brushes, usw. sind Objekte, welche sehr leichtgewichtig sind und daher schnell erstellt sind. Ich würde diese daher einsparen. Bitmaps hat man meistens nicht so viele, weil wahrscheinlich vorher der Arbeitsspeicher volllaufen würde. Zudem legt man Bitmaps meitens schon optimiert ab. Heisst ein Bild wird nur einmal geladen. Bei Fonts, Brushes, usw. läufst du halt Gefahr, dass du für das gleiche immer und immer wieder neue Objekte erstellst und sie dann eben unnötigerweise behälst.

    Grüssli



  • Danke, das ist genau was ich gesucht hab. Nur aus Interesse: Gilt diese Limitierung eigentlich pro Applikation/Prozess oder Betriebssystem weit? Das heisst, kann ich damit sogar andere Anwendungen blockieren, wenn ich zu viel mit dem GDI Zeug rumpfusche?



  • Ja, das gilt für alle Anwendungen. Es kann dann sein, daß sich keine Menüs mehr öffnen, falsch gezeichnet wird, etc.
    Ich mußte deswegen mal eine meiner Anwendungen umschreiben, da ich eine komplexe GUI mit verschachtelten TabPages hatte und es dann bei vielen TabPages zu diesen Effekten kam -> die untergeordneten Controls habe ich dann dynamisch bei einem TabPage-Change jeweils neu erzeugt (und mir nur die Inhalte im Speicher gemerkt).


Anmelden zum Antworten