Forum: PC-Programmierung c# Objektorientierte Frage.


von Stefan (Gast)


Lesenswert?

Hi,

ich habe eine Frage zur Objektorientierung. Bin da noch relativ neu.

Ich nutze Visual Studio. In meinem Form habe ich eine Listview mit 
mehreren Daten, in Spalte 3 steht bspw. ein Offset den ich an eine 
Funktion übergeben möchte (in diesem Fall FSUIPC welches mir Daten aus 
dem Microsoft Flight simulator ausgibt).

http://forum.simflight.com/topic/74848-fsuipc-client-dll-for-net-version-24/

Ich möchte also für jedes Item in dieser Listview den Offset an der 
Stelle subitem[2] übergeben und den Wert nachher in eine Textbox 
schreiben. Momentan sieht es wie folgt aus:
1
 private void readValues()
2
        {     
3
            foreach (ListViewItem item in listView1.SelectedItems) //Load Items into Properties Window
4
            {
5
                int OffsetVar = Convert.ToInt32(item.SubItems[2].Text, 16); //Convert String to Hex Int
6
                Offset<int> valOffset = new Offset<int>(OffsetVar);         //register new Offset
7
                FSUIPCConnection.Process();                                 //Process everything
8
                double Value = valOffset.Value;                            //read Data
9
                textBox1.Text = Value.ToString();                    //Display Data
10
}
11
}

Funktioniert auch soweit ganz gut, das einzige roblem ist, das dieser 
Befehl ein paar Mal die Sekunde ausgeführt wird und diese eine Variable, 
bzw. das Offset immer wieder erstellt wird sodass das Programm nach ein 
paar Minuten den ganzen Speicher vermüllt.

Leider gibt es anscheinend auch keine Dispose funktion für das Objekt 
(?) valOffset.

Daher meine Frage. Wie kann ich dieses Objekt valOffset, bzw. mehrere 
davon, während der Runtime generieren (da ab und zu auch Sachen aus 
meinem Listview verschwinden können) und trotzdem in anderen Funktionen 
darauf zugreifen (da ich dieses Objekt einmal erstellen, aber öfters 
darauf zugreifen will).

Grüße

Stefan

von Peter II (Gast)


Lesenswert?

du kannst doch die Variabel außerhalb der schleife definieren.

Was ist Offset für ein Datentype?

von Stefan (Gast)


Lesenswert?

Das wird warscheinlich etwas verwirrend mit den ganzen Offsets :D

Also, Offset<> ist die Klasse, beim initialisieren muss ich auch den Typ 
angeben den ich nachher heraus bekommen will, in meinem Fall hier gerade 
int.

Den Wert den ich beim initialisieren angeben muss (OffsetVar) ist die 
Adresse als int.

Peter II schrieb:
> du kannst doch die Variabel außerhalb der schleife definieren.
>

Aber wie denn genau? Das Problem ist, das ich vorher (beim Start des 
Programms) nicht weiss wieviele Objekte ich in der Liste habe. Dann 
starte ich die readvalues Funktion welche dann alle Offsets deklariert 
(indem sie die Daten aus dem listview liest) und die Werte ausliest.

Das ganze möchte ich nun jedoch ein paar mal Pro sekunde machen (also 
diese Funktion aufrufen um die Werte zu initialisieren), mache ich das 
aber nun erhalte ich zig valOffset Objekte die anscheinend nicht 
gelöscht werden. Ich dachte auch daran am ende einfach 
valOffset.Dispose() aufzurufen, jedoch funktioniert sowas anscheinend 
nicht ('Offset<int>' does not contain a definition for 'Dispose' and no 
extension method 'Dispose' accepting a first argument of type 
'Offset<int>' could be found (are you missing a using directive or an 
assembly reference?))

von El Mucho (Gast)


Lesenswert?

Stefan schrieb:
> Ich möchte also für jedes Item in dieser Listview

Für jedes selektierte Item (listView1.SelectedItems), oder?

>int OffsetVar = Convert.ToInt32(item.SubItems[2].Text,
> 16); //Convert String to Hex Int

Von Hex, nicht nach Hex.

> das einzige roblem ist, das dieser
> Befehl ein paar Mal die Sekunde ausgeführt wird und diese eine Variable,
> bzw. das Offset immer wieder erstellt wird sodass das Programm nach ein
> paar Minuten den ganzen Speicher vermüllt.

Wie hast du das festgestellt? Falls 'Offset' nicht wirklich riesig ist 
und das Ganze nur einige Male pro Sekunde ausgeführt wird, halte ich das 
nämlich für eine ziemlich wilde Spekulation ...

> das einzige problem ist

Hmm ... Irgendwie verstehe ich den Sinn des Codes noch nicht. Du 
iterierst über alle selektierten Items und überschreibst dabei immer 
wieder den Wert in textBox1. Am Ende steht darin doch nur der Wert von 
SubItems[2].Text der letzten selektierten Zeile.

von Peter II (Gast)


Lesenswert?

Stefan schrieb:
> Also, Offset<> ist die Klasse, beim initialisieren muss ich auch den Typ
> angeben den ich nachher heraus bekommen will, in meinem Fall hier gerade
> int.

ist die dir? Was machst sie intern - nicht das sie etwas macht und den 
Speicher dann nicht freigibt?

Kannst du sie uns zeigen?

von Stefan (Gast)


Lesenswert?

Ihr habt recht! Anscheinend macht es nicht wirklich etwas aus.

Am Anfang habe ich die Funktion Testweise auf einen Button gelegt 10-20 
mal ausgeführt und jedes 3-4 mal belegte das Programm (abgelesen im 
Taskmanager) knapp 0.1MB mehr im Arbeitsspeicher. Daher meine Vermutung.

Nun habe ich es aber auf einen Ticker mit 250ms gelegt und siehe da, es 
funktioniert anscheinend! Er steigt zwar anfangs um ca 2MB an, jedoch 
bleibt es auch nach ca 5 Minuten dabei.

El Mucho schrieb:
> Hmm ... Irgendwie verstehe ich den Sinn des Codes noch nicht. Du
> iterierst über alle selektierten Items und überschreibst dabei immer
> wieder den Wert in textBox1. Am Ende steht darin doch nur der Wert von
> SubItems[2].Text der letzten selektierten Zeile.

Das überschreiben der Textbox war auch nur Testweise, nun kann es weiter 
gehen :)



Peter II schrieb:
>
> ist die dir? Was machst sie intern - nicht das sie etwas macht und den
> Speicher dann nicht freigibt?
>
> Kannst du sie uns zeigen?

Die Klasse ist aus einer externen DLL importiert, daher weiss ich leider 
nicht genau was darin vor sich geht.


Vielen Dank, falls ich noch weitere Fragen habe melde ich mich.

Ich habe mich erst gewundert und dachte ich wäre nicht im 
mikrocontroller Forum gelandet, weil zwar Antworten in meinem Thread 
waren, jedoch bisher keine Einzige Beleidung dabei war! Hier geht es 
ganz anders zu als im Hardware Teil diese Forums, das ist mir 
sympathisch :)

Grüße

Stefan

von Markus (Gast)


Lesenswert?

Peter II schrieb:
> du kannst doch die Variabel außerhalb der schleife definieren.

Das würde nur dann was bringen, wenn Offset<> ein struct und keine class 
wäre. Wenn nämlich Offset<> eine class ist, wird mit jedem new Speicher 
auf dem Heap allokiert. Freigeben kann man den aber nicht explizit, was 
ein Aufruf von Dispose auch nicht ändert, wenn Offset<> denn IDisposable 
implementieren würde.

Grüße
Markus

von Peter II (Gast)


Lesenswert?

Markus schrieb:
> Das würde nur dann was bringen, wenn Offset<> ein struct und keine class
> wäre. Wenn nämlich Offset<> eine class ist, wird mit jedem new Speicher
> auf dem Heap allokiert. Freigeben kann man den aber nicht explizit, was
> ein Aufruf von Dispose auch nicht ändert, wenn Offset<> denn IDisposable
> implementieren würde.

aber durch die neue Zuweisung der gleichen Variabel könnte das system 
die gleichen Speicher zuweisen. Und müsste ihn nicht im nachgang 
bereinigen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.