vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Fortgeschrittene
Exception unhandled System.OutOfMemoryException 
Autor: Konsi
Datum: 15.05.18 12:18

Hallo,

ich habe eine kleine Anwendung geschrieben die lediglich eine Zeitdifferenz berechnet. Diese Anwendung hat eine Form mit einer Hand voll Einstellmöglichkeiten. Diese Form lässt sich aus der Hauptform, durch einen Button aufrufen:

frmSettings.ShowDialog
Hier kommt immer nach einer bestimmten Zeit, nicht sofort, erst so gegen 1 Stunde Laufzeit ein Fehler. Dieser tritt ein sobald man auf den Button klickt, der die 2te Form (frmSettings) öffnet.

Der Fehler lautet: Exception unhandled System.OutOfMemoryException

Ich weis nicht an was das liegen könnte. Hat jemand eine Idee?

Danke.

----
Gru?, Konsi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception unhandled System.OutOfMemoryException 
Autor: Konsi
Datum: 15.05.18 13:14

der genaue Fehler heißt:

Exception unhandled System.OutOfMemoryException
System.OutOfMemoryException occurred
HResult=0x8007000E
Message=Nicht genügend Arbeitsspeicher.
Source=System.Drawing
StackTrace:
at System.Drawing.Graphics.FromHdcInternal(IntPtr hdc)
at System.Drawing.Font.GetHeight()
at System.Drawing.Font.get_Height()
at System.Windows.Forms.GroupBoxRenderer.DrawThemedGroupBoxWithText(Graphics g, Rectangle bounds, String groupBoxText, Font font, Color textColor, TextFormatFlags flags, GroupBoxState state)
at System.Windows.Forms.GroupBoxRenderer.DrawGroupBox(Graphics g, Rectangle bounds, String groupBoxText, Font font, TextFormatFlags flags, GroupBoxState state)
at System.Windows.Forms.GroupBox.OnPaint(PaintEventArgs e)
at System.Windows.Forms.Control.PaintWithErrorHandling(PaintEventArgs e, Int16 layer)
at System.Windows.Forms.Control.OnPrint(PaintEventArgs e)
at System.Windows.Forms.Control.WmPrintClient(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.GroupBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
at System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
at System.Windows.Forms.Control.DefWndProc(Message& m)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ComboBox.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

----
Gru?, Konsi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception unhandled System.OutOfMemoryException 
Autor: Manfred X
Datum: 16.05.18 07:48

Hallo!

Das Net-Framework ist komplex.
Ohne nähere Angaben gibt es einige Ideen.

Eventuell ist der zu erstellende Font im System nicht korrekt installiert
und liefert unsinnige Anforderungsparameter.

Eventuell werden im Paint-Event wiederholt Klassen-Instanzen erstellt,
die z.B. GDI-Objekte nutzen, ohne die Handles wieder frei zu geben
(Pinsel, Stifte, Bitmaps, ...). Verwende ggf. Using-Blöcke oder rufe
nach Gebrauch die Dispose-Methoden dieser Klassen.

Allerdings kann der speicherfressende Fehler irgendwo im Programm liegen
und wird erst beim Erstellen der Form (zusätzlicher Speicherbedarf) sichtbar.
Der Error-Trace ist in diesem Fall nicht aussagekräftig.

Werfe einen Blick in den Windows Task-Manager und prüfe den Speicherbedarf
Deiner Anwendung zur Laufzeit. Wächst dieser Wert kontinuierlich an,
liegt ein Freigabeproblem vor.
Steigt die Zahl der Handles, kann ein GDI-Ressourcen-Freigabeproblem vorliegen
(z.B. im Rahmen einer "Ereigniskette", die allerdings meist zu einem Stapel-
Überlauf führt).

Beitrag wurde zuletzt am 16.05.18 um 07:56:25 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Exception unhandled System.OutOfMemoryException 
Autor: Konsi
Datum: 16.05.18 08:31

Hallo Manfred,

vielen Dank für deinen Denkansatz. Ich werde das mal so beobachten und mich melden.

----
Gru?, Konsi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Befolge einen Programmiergrundsatz: 
Autor: Souffleurlos
Datum: 23.05.18 18:20

Hallo KOnsi

Resourcen vom System, die Du nimmst, gib auch selbst wieder frei. Verlässt Du dich auf den GC, bist du verlassen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Befolge einen Programmiergrundsatz: 
Autor: Konsi
Datum: 25.05.18 07:33

Hallo Souffleurlos,

das ist ja das was ich nicht verstehe.
Es ist ein Programm dass eine Zeitdifferenz zwischen der Aktuellen Zeit und einer Zeit in der Zukunft berechnet. Es hat ein paar kleine Einstellmöglichkeiten und die Funktion im Tray zu laufen. Da steckt nicht wirklich viel Code dahinter. Und überwiegend laufen 2 Timer. Die Variablem sind an einer Hand abzählbar, sodass es zu keinen Größeren Speicherbelegungen kommen darf. Wo der Fehler herkommt ist mir unverständlich. Wenn ich mir den Taskmanager anschaue, dann läuft das Tools mit gerade mal ca. 6MB Arbeitsspeicher, keine CPU Last und mit ca. 270 Handles.

----
Gru?, Konsi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Befolge einen Programmiergrundsatz: 
Autor: Manfred X
Datum: 26.05.18 07:22

Hallo!

[I]Und überwiegend laufen 2 Timer. Die Variablem sind an einer Hand abzählbar,
so dass es zu keinen Größeren Speicherbelegungen kommen darf.[/I]

Eventuell wird in den Tick-Eventhandlern der Timer jeweils
ein Objekt erstellt und nicht wieder freigegeben.

Vielleicht wird dort unter gewisssen Bedingungen versucht,
ein Objekt (Klasseninstanz, New) zu erstellen - mit fehlerhaften
(timer-gesteuerten?) Konstruktions-Parametern.
In dem Fall wächst der Speicher im Task-Manager nicht an, sondern die
Erstellung des "Riesenobjekts" scheitert direkt.

Versuche den Code Deines Projekts sukzessive zu reduzieren, bis nur noch
das Problem übrig bleibt und poste ihn.

Beitrag wurde zuletzt am 26.05.18 um 07:26:38 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Befolge einen Programmiergrundsatz: 
Autor: sv00010
Datum: 26.05.18 11:31

Konsi schrieb:
Zitat:

Hallo Souffleurlos,

das ist ja das was ich nicht verstehe.
Es ist ein Programm dass eine Zeitdifferenz zwischen der
Aktuellen Zeit und einer Zeit in der Zukunft berechnet. Es
hat ein paar kleine Einstellmöglichkeiten und die Funktion im
Tray zu laufen. Da steckt nicht wirklich viel Code dahinter.
Und überwiegend laufen 2 Timer. Die Variablem sind an einer
Hand abzählbar, sodass es zu keinen Größeren
Speicherbelegungen kommen darf. Wo der Fehler herkommt ist
mir unverständlich. Wenn ich mir den Taskmanager anschaue,
dann läuft das Tools mit gerade mal ca. 6MB Arbeitsspeicher,
keine CPU Last und mit ca. 270 Handles.

Ich hatte auch mal dieses Problem.
Woher es kam, habe ich nicht herausgefunden.
Auf jeden Fall habe ich dann in den Timer eine Zählvariable mit Shared definiert und bei jedem Aufruf eins weiter gezählt.
Wenn der Zähler bei 200 angekommen ist, wird er wieder auf 0 zurückgesetzt und GC.Collect() aufgerufen.
Somit habe ich das Problem irgendwie abgewürgt (ohne wirklich verstanden zu haben wieso es auftritt).
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Befolge einen Programmiergrundsatz: 
Autor: Konsi
Datum: 28.05.18 08:23

Hallo,

ich verstehe es wirklich nicht. Nachdem das Tool nicht wirklich groß ist, stelle ich einen Link zum Quellcode, vielleicht kommen so hinter die Problematik.

Das Problem kamm immer beim Klick auf den Button aus der Form1 heraus, der die frmSettings aufruft. Ich hab das ganze jetzt umgebaut (mega pfusch). Jetzt wird beim Klick auf den Button die Exe komplett geschlossen und mit Parametern neu gestartet.

http://konsi.de/ampel2.txt

----
Gru?, Konsi

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Befolge einen Programmiergrundsatz: 
Autor: Manfred X
Datum: 28.05.18 14:38

Hallo!

Der gesamte Designergenerierte Code des Projekts
(Deklaration und Einrichtung der Controls) fehlt im Upload.
Ebenso fehlt das Formular frmTimer. (Und Variablen ??)
Genaues kan ich deshalb nicht sagen.

Du verwendest Default-Instanzen der Formulare und greifst
über Kreuz auf diese Instanzen zu: frmHaupt <-> frmSettings
(auch im Timer-Tick-Handler). Mit hoher Wahrscheinlichkeit
liegt hier das Problem.

Programmiere ordnungsgemäß:
1. In frmHaupt einmalig eine Instanz von frmSettings erstellen (New).
2. In frmHaupt auf Eigenschaften der frmSettings-Instanz zugreifen
und diesen Einstellungsdialog bei Bedarf mit ShowDialog in frmHaupt
öffnen.
3. frmSettings-Daten entweder per Event melden (Raise) und dieses
Event in frmHaupt verarbeiten oder nach Abschluß des Dialogs die
in der frmSettings-Instanz gesetzten Eigenschaften in frmHaupt
abfragen.
4. Nutze Try-Catch-Blöcke und NIE "On Error Resume Next".

Beitrag wurde zuletzt am 28.05.18 um 15:03:48 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Befolge einen Programmiergrundsatz: 
Autor: sv00010
Datum: 28.05.18 17:53

Konsi schrieb:
Zitat:


vielleicht kommen so hinter die Problematik.


Das hier sieht verdächtig aus:

'Icon wechseln
        If blnShowTraffiLight = True Then
            If nSeks < 1800 And nSeks > 0 Then
                TrayIcon.Icon = Icon.FromHandle(CType(imgList.Images(1), _
                  Bitmap).GetHicon())
            ElseIf nSeks < 0 Then
                TrayIcon.Icon = Icon.FromHandle(CType(imgList.Images(2), _
                  Bitmap).GetHicon())
            ElseIf nSeks > 1800 Then
                TrayIcon.Icon = Icon.FromHandle(CType(imgList.Images(0), _
                  Bitmap).GetHicon())
            End If
        Else
            'TrayIcon.Icon = Me.Icon
            'TrayIcon.Icon = Icon.FromHandle(CType(imgList.Images(6), 
            ' Bitmap).GetHicon())
            If nSeks < 1800 And nSeks > 0 Then
                TrayIcon.Icon = Icon.FromHandle(CType(imgList.Images(8), _
                  Bitmap).GetHicon())
            ElseIf nSeks < 0 Then
                TrayIcon.Icon = Icon.FromHandle(CType(imgList.Images(6), _
                  Bitmap).GetHicon())
            ElseIf nSeks > 1800 Then
                TrayIcon.Icon = Icon.FromHandle(CType(imgList.Images(7), _
                  Bitmap).GetHicon())
            End If
        End If
Ist es denn wirklich notwendig, das Icon immer neu zu erstellen ?
Falls nicht würde ich empfehlen, die Icons nur einmal beim Programmstart zu erstellen
und dann immer nur das entsprechende fertige Icon zu verwenden.

Beitrag wurde zuletzt am 28.05.18 um 17:55:03 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel