Ressourcen Überawachen

D12

Mitglied
Hallo Leute,

ich habe eine verteilte Anwendung erstellt, die aus vier Teilen besteht.

1. RemoteObject, das als Singleton genutzt wird und als Zählwerk mit eigenen Membern und Methoden eingesetzt wird. Einige dieser Methoden, geben ein Array zurück.

2. RemoteService, der das RemoteObject registriert

3. RemoteClient, der über einen Timer die Zählerstände und andere Zustände im RemoteObject ausliest.

4. IOcounter, als Windos Dienst, der Signale aus einem IO-Gerät in einzelne Bits umwandelt und an das Remote Object übergibt.

ZWEI PROBLEME:
1. Die Anwendungen laufen stabil, aber der Remote Client flackert bei jedem Refresh, kann man das flackern abstellen?

2. Der Speicher wird aufgeblasen. Die Probleme verursacht das RemoteObject. Denn erst wenn das beendet wird, wird auch wieder der Speicher frei gegeben. Ich vermute das es die Methoden sind, die Arrays zurückgeben. Denn wenn diese stärker benutzt werden, dann wächst der Speicherbedarf wesentlich schneller. Kann ich den Garbage-Collector zwingen Speicher nach Übergabe/Rückgabe frei zu geben?

Ich bin für jede Idee dankbar. Leider kann ich meine Anwendungen nur mit #Develope programmieren, da mir das geld für VisualStudio fehlt. Hier fehlen mir Debugging Optionen, die auch die Speicher-Ressourcen zeigen, die meine Anwendung benötigt.

Grüße,
D12
 
In welchen Abständen fragt denn dein Timer nach? Davon abgesehen gibts die Methoden SuspendLayout und ResumeLayout für die betroffenen GUI-Elemente. Eventuell helfen die.

Zum RemoteObject:
Eventuell die dahinterliegenden Methoden/Klassen genauer ansehen und nach unsauber programmiertem Code sehen. Variablen, die innerhalb einer Loop deklariert werden etc. All das verbraucht ne Menge Speicher. Um dem Garbage Collector mitzuteilen, dass er entleeren soll, immer die zu verwerfenden Objekte auf null setzen. Den GC direkt zu starten würde ich nicht tun, zumal er selbst dann nicht sofort anfährt.
 
Also zu


1. Hast du eine GDI+ Oberfläche ? Wenn ja, dazu gibts in diesem Forum bereits einen Post, da musste man den Buffer erhöhen oder sowas... Such einfach mal danach.

2. Kommt drauf an wie du das Programmiert hast. Da das Singleton Object eigendlich nur einmal existiert, sollte sich der Speicherbedarf eigendlich in Grenzen halten. Aber du könntest eine Methode einführen, die nach der Rückgabe der Daten aufgerufen wird, und den Speicher wieder freigibt. (z.b. nach Rückgabe einer Liste die Variable davon zurücksetzt (nur nötig bei Klassenvariablen oder Globalen Variablen))

3. Es gibt die Möglichkeit das du dir eine 180Tage Trial Version von VS2005 von Microsoft besorgst, ist kostenlos. Dann hast du uneingeschränke Möglichkeiten bis zum Ablauf der Frist.

Gruss

MFC OpenGL
 
Norbert Eder hat gesagt.:
In welchen Abständen fragt denn dein Timer nach? Davon abgesehen gibts die Methoden SuspendLayout und ResumeLayout für die betroffenen GUI-Elemente. Eventuell helfen die.
hmmm... Der Timer ist variable, kann vom Benutzer eingestellt werden, zwischen 205ms und unendlich! Je länger die TiemrIntervalle sind, desto weniger fällt das Flackern auf! Kannst die beiden Methoden kurz erläutern, oder bin ich gezwungen Bücher zu wälzen?

Norbert Eder hat gesagt.:
Zum RemoteObject:
Eventuell die dahinterliegenden Methoden/Klassen genauer ansehen und nach unsauber programmiertem Code sehen. Variablen, die innerhalb einer Loop deklariert werden etc. All das verbraucht ne Menge Speicher. Um dem Garbage Collector mitzuteilen, dass er entleeren soll, immer die zu verwerfenden Objekte auf null setzen. Den GC direkt zu starten würde ich nicht tun, zumal er selbst dann nicht sofort anfährt.
Wie kann ich einen Rückgabewert einer Methode auf null setzen, nachdem er übergeben wurde? Beispiel

int[] x = MeineMethode();

public int[] MeineMethode()
{

}
 
MFC openGL hat gesagt.:
1. Hast du eine GDI+ Oberfläche ? Wenn ja, dazu gibts in diesem Forum bereits einen Post, da musste man den Buffer erhöhen oder sowas... Such einfach mal danach.
Ja, IC SharpDevelope --> http://www.icsharpcode.net/ Wofür soll der Buffer sein?

MFC openGL hat gesagt.:
2. Kommt drauf an wie du das Programmiert hast. Da das Singleton Object eigendlich nur einmal existiert, sollte sich der Speicherbedarf eigendlich in Grenzen halten. Aber du könntest eine Methode einführen, die nach der Rückgabe der Daten aufgerufen wird, und den Speicher wieder freigibt. (z.b. nach Rückgabe einer Liste die Variable davon zurücksetzt (nur nötig bei Klassenvariablen oder Globalen Variablen))
Die Rückgabewerte sind keine Klassenvariablen, nicht global, nur lokal aber im Moment bin ich nicht sicher was nach der Übergabe mit der erzeugten Variable passiert!

MFC openGL hat gesagt.:
3. Es gibt die Möglichkeit das du dir eine 180Tage Trial Version von VS2005 von Microsoft besorgst, ist kostenlos. Dann hast du uneingeschränke Möglichkeiten bis zum Ablauf der Frist.
180 Tage sind sehr kurz, habe mich grad erst selbstständig gemacht. Werde mir aber hoffentlich bald VS zulegen. Kann man da solche RemoteObject debuggen? So das man sieht was mit dem Speicher passiert?
 
D12 hat gesagt.:
hmmm... Der Timer ist variable, kann vom Benutzer eingestellt werden, zwischen 205ms und unendlich! Je länger die TiemrIntervalle sind, desto weniger fällt das Flackern auf! Kannst die beiden Methoden kurz erläutern, oder bin ich gezwungen Bücher zu wälzen?
Nun, 205ms ist schon sehr kurz. Nehmen wir an du schreibst den Wert in ein Label names label1.
Code:
label1.SuspendLayout();
label1.Text = myValue;
label1.ResumeLayout();
Damit wird die Neuzeichnung des Labels unterbrochen und erst beim ResumeLayout wieder ausgeführt. Dies bringt dann etwas, wenn du in der Zwischenzeit einige Änderungen vornehmen musst.

Die andere Variaten, die hier in den Raum geworfen wurde ist das Aktivieren des DoubleBuffers. Dieser verwendet einen Buffer um die Daten darzustellen. Da alles auf GDI+ basiert was mit Windows.Forms zu tun hat, könnte das eine Verbesserung bringen.
Code:
SetStyle( ControlStyles.UserPaint, true );
SetStyle( ControlStyles.AllPaintingInWmPaint, true );
SetStyle( ControlStyles.DoubleBuffer, true );
D12 hat gesagt.:
Wie kann ich einen Rückgabewert einer Methode auf null setzen, nachdem er übergeben wurde? Beispiel

int[] x = MeineMethode();

public int[] MeineMethode()
{

}
Nach dem Return gar nicht mehr. Wieviele Werte umfassen denn deine Arrays? Bzw. kann es sein, dass die Abarbeitung innerhalb deiner Methode soviel Speicher verbraucht und nicht die Arrays?
 
Wegen des flackerns...

http://www.tutorials.de/tutorials226005.html&highlight=flackern

Wegen des Speichers...
Würde versuchen die Rückgabevariablem als Klassenvariablem zu deklarieren, und per z.b. tonull() Methode komplett rückzusetzen, nachdem du die Daten bekommen hast. Aber eigendlich müsste der GC die Objekte direkt nach dem verlassen der Methode löschen, denn die sind ja sicher nicht auch Static, oder ?

Zu der Trial...
180 Tage dürften aber fürs erste reichen, bis du den 1. Auftrag erfolgreich abgeschlossen hast, und genug Geld für eine Vollversion hast.

Gruss

MFC OpenGL
 
Anmerkung:
Nun habe ich alle Methoden überarbeitet. DA ich nicht direkt auf die Member des RemoteObjects zugrifen darf, habe ich mit Call By Reference gearbeitet!

Die neue Funktionsweise sieht wie folgt aus:
Aufruf im Client:
int[] tmp = new int[0];
MeineMethode(ref tmp);
...


Methode im Remote Object:
public void MeineMethode(ref int tmp)
{
tmp = this.werteliste;
}

Trotzdem entwickelt sich der Speicher explosionsartig. Gibt es irgendein Programm mit dem ich herausfinden kann, welche DatenMember das Problem verursachen? Irgendwas, wo ich sehen kann welche Speicherbereiche welcher Anwendung und welcher Variablen zugeordnet sind?

cu s00n
D12
 

Neue Beiträge

Zurück