Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#9

Re: Problem mit Speicher und Handle

  Alt 14. Mär 2008, 12:29
Nach einigem an Testen habe ich den Fehler gefunden. Und zwar hole ich dazu etwas weiter aus:

Im Taskmanager hat man die Möglichkeit sich mehrere Spalten anzeigen zu lassen, unter dem Tab Prozesse. Dort habe ich mir, wie im Screenshot (siehe Anlage) die Handles, Thread und Objekte, die eine Anwendung zurzeit benötigt anzeigen lassen. Nun bin ich dann mit dem Debugger durch meine Anwendung gegangen und habe nach dem Problem selbst gesucht, d.h. an welches Stelle nun das Problem auftritt. Hierbei war sehr auffällig, dass die Benutzerobjekte einen sehr großen Teil ausgemacht hatten. Und zwar handelte es sich bei mir um einen Timer. Dieser wurde beim Konstruktor eines Objekts erzeugt, dieser erhält auch ein Handle! Bei genau 10000 Timern, d.h. 10000 Benutzerobjekten war dann Schluss und es wurde die Exception geworfen. Die Handle-Zahl stieg dabei allerding nicht! (laut Task-Manager)

Mein Problem hierbei war das folgende: ich wollte eine MDI-Anwendung erstellen, d.h. für jedes Objekt sollte es möglich sein, ein MDI-Formular aufrufen zu lassen. Per eingebauten Timer sollte sich das Objekt, welches einem Datensatz in der Datenbank zugeordnet ist, dann sperren, d.h. sodass kein anderer User daran Daten ändern kann. Dies mache ich, indem ich alle 20 Sekunden einen Zeitstempel in die DB schreibe und diesen dann bei einem anderen User, welcher auf den Datensatz zugreift abfrage. Nun habe ich, wie schon erwähnt den Timer beim Konstruktor erzeugt und dann eben beim Öffnen des MDIs nur gestartet, ergo war das Timer-Objekt immer vorhanden. Dies hätte dann dazu geführt, das ab 10000 Datensätzen mein Programm abschmiert. Durch einen weiteren dummen Programmierfehler (ich habe die Timer nicht an der passenden Stelle freigegeben) bin ich dann erst auf das Problem gestoßen. Nun setze ich nicht mehr lediglich den Timer auf Enabled, sondern erzeuge ihn erst beim Erstellen des MDI-Forumlars und beschränkte die maximale Anzahl der geöffneten MDI-Forumlare, sodass ich dieses Problem umgehen kann. Eigentlich brauch ich keine Beschränkung, da 10000 eine recht große Zahl ist, aber ich habe ja noch andere Elemente, die auch Platz brauchen

Ich hoffe, ich habe nun alles passend erklärt! Wenn es noch Fragen oder Unklarheiten geben sollte, dann bitte melden.

PS: Wer Rechtschreibfehler findet darf sie behalten

[EDIT] Bild vergessen [/EDIT]

Mit freundlichen Grüßen
der Hai
Miniaturansicht angehängter Grafiken
screenshot_977.png  
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat