| |
VB.NET - FortgeschritteneException 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 | |
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 | |
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. | |
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 | |
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. | |
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 | |
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. | |
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). | |
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 | |
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. | |
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. | |
| 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 |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|