Benutzer- und GDI-Objekte

Einer steigenden Komplexität von Applikationen steht oft eine Zunahme von Objekten in der Benutzeroberfläche gegenüber. Jedes in CONZEPT 16 erzeugte Oberflächen-Objekt hat einen unmittelbaren Einfluss auf die Ressourcen von Windows.


So wie CONZEPT 16 dem Entwickler ein Handle auf die Steuerelemente zur Verfügung stellt, um mit den Objekten arbeiten zu können, existiert analog dazu ein entsprechender Handle (HWND) unter Windows. Für jedes Windows-Handle wird ein sogenanntes Benutzer-Objekt erzeugt. Bei der Verwendung von Grafikobjekten (wie Fonts oder Bitmaps) allokiert eine Applikation unter Windows GDI-Objekte.

Die Anzahl der Objekte, die eine Applikation verwenden kann, ist eine fest vorgegebene Größe und damit unabhängig des verfügbaren Hauptspeichers. Jeder Prozess unter Windows kann maximal 10.000 Benutzer- und 10.000 GDI-Objekte allokieren. Das hört sich auf den ersten Blick ausreichend an, kann aber in der Praxis durchaus erreicht werden. Bei Anwendungen, die dem Benutzer zum Beispiel über viele Notizbuchseiten Informationen zur Verfügung stellen, kann die Anzahl der Objekte eines Fensters unter Umständen zwei bis dreitausend betragen. Bei mehreren gleichzeitig geöffneten Frames wird dann das Limit unvermeidlich erreicht.

Was passiert, wenn die maximale Anzahl erreicht wurde?

Bei Erreichen des maximalen Anzahl der Handles gibt Windows selbst keine Meldung aus. In den betroffenen Anwendungen kommt es allerdings zu Darstellungsfehlern. So kann es schon mal sein ein, dass ein Menü komplett fehlt. Damit es in CONZEPT 16 dazu nicht kommt, findet seit der Client-Version 5.3.09 vor dem Laden eines Fensters eine Überprüfung der Windows-Ressourcen statt. Stehen weniger als 10% der Benutzer-Objekte zur Verfügung, wird das Fenster nicht geladen und die entsprechende Funktion (WinOpen(), WinDialog() und WinAddByName()) gibt den Fehlercode _ErrOutOfMemory zurück.

Wie kann ich ermitteln, wie viele Ressourcen meine Anwendung aktuell verwendet?

  • Unter WindowsÜber den Task-Manager lässt sich der Verbrauch an Benutzer- und GDI-Objeken ermitteln. Standardmäßig werden die Spalten nicht angezeigt und müssen nachträglich auf sichtbar gestellt werden.
Task-Manager
  • In CONZEPT 16Auf der Seite „System“ des „Info-Dialogs“ lässt sich der Verbrauch an Benutzer- und GDI-Objekten ablesen. Dieser Dialog lässt sich über die Funktion WinOpen(_WinC16Info) auch in die eigene Anwendung integrieren.
Info-Dialog

Welche Möglichkeiten stehen mir als Entwickler zur Verfügung?

Für die Objekte innerhalb eines Notizbuches stellt CONZEPT 16 eine Optimierungsmöglichkeit zur Verfügung. Bei der Eigenschaft wpFlags des Application-Objekts (_App) kann die Option _WinAppNotebookPageDelayed gesetzt werden. In diesem Fall werden für die Objekte einer Notizbuchseite erst dann die Windows-Handles erzeugt, wenn die Seite das erste Mal sichtbar wird.

6 Antworten

  1. nach meinem Test offensichtlich der C16-Prozess auf dem Terminalserver, wärend der Client-Prozess wohl nur als Anzeige dient und die C16-Objekte nicht kennt.

  2. @Th.Eichele
    Dazu muss die Summe der Objekte eines Frames mit Hilfe der Funktion WinInfo() ermittelt werden. Die Anzahl der Objekte entspricht ungefähr der Anzahl der GDI-Objekte.

  3. Gibt es eine Möglichkeit alle Frames aufzuspüren, die z.B. mehr als 1000 Objekte verbrauchen würden, um bei deren Aufruf bevorzugt diesen Fehler abzufangen ?

Schreiben Sie einen Kommentar

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Leave the field below empty!

IHRE EVALUIERUNGSLIZENZ - JETZT ANFORDERN!

TESTEN SIE DIE CONZEPT 16 VOLLVERSION - UNVERBINDLICH und KOSTENFREI

Melden Sie sich bei unserem Newsletter an

Anrede*
     
Zustimmung zur Datenverarbeitung gem. DSGVO*



WordPress Cookie-Hinweis von Real Cookie Banner