Autor Beitrag
Arthuro
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 07.12.07 13:35 
Guten Tag,

Ich würde gerne den aktuellen Arbeitsspeicher ermitteln in meiner Form.
Außerdem den verbrauchten wenn ich ein programm gestartet habe.

Leider habe ich hier kaum was gefunden zu diesem Thema deswegen mache ich ein Thema auf und im Internet auch nichts konkretes.

Deswegen dachte ich frag mal nach und man kann mir hier Tipps geben.

Danke

Gruß Arthuro


Moderiert von user profile iconChristian S.: Topic aus C# - Die Sprache verschoben am Fr 07.12.2007 um 12:40
golgol
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 58

Win XP Prof. / Linux
C# (VS 2005)
BeitragVerfasst: Fr 07.12.07 13:57 
Ich weiss nicht was du genau mit "aktuell" meinst, daher hab ich dir einfach beide möglichen Interpretationen aufgeschrieben.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
// Speicherauslastung (in Byte)
PerformanceCounter perCnt = new PerformanceCounter("Memory""Available Bytes");
long availableMemory = (Convert.ToInt64(perCnt.NextValue()));

// Gesamtspeicher (in Byte)
ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT totalphysicalmemory FROM Win32_ComputerSystem");
ManagementObjectCollection res = searcher.Get();
long totalMemroy = 0;
foreach (ManagementObject mo in res)
{
    totalMemory = long.Parse(mo["totalphysicalmemory"].ToString());
}


Ahja, die Daten für ein gestartetes Programm bekommst du über den Prozess aus, also:

ausblenden C#-Quelltext
1:
2:
3:
Process p = Process.GetProcessById(iID);
long ramNeeded = p.WorkingSet64;
long virtualRamNeeded = p.VirtualMemorySize64;


Über den Prozess kannst du dann auch noch jede Menge andere Infos abfragen, falls da Bedarf bestehen sollt.
Arthuro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 07.12.07 14:00 
Vielen Dank erstmal muss mir das erstmal anschaun:

Bei mir fehlt ein using welches using ist den für ManagementObjectSearcher ?
golgol
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 58

Win XP Prof. / Linux
C# (VS 2005)
BeitragVerfasst: Fr 07.12.07 14:02 
user profile iconArthuro hat folgendes geschrieben:
Bei mir fehlt ein using welches using ist den für ManagementObjectSearcher ?


System.Management
Arthuro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 07.12.07 14:10 
Sicher ?

using System.Management; gibt bei mir nicht ? Das einzigste was mit M gibt ist Media.

Gruß Arthuro
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Fr 07.12.07 14:13 
user profile iconArthuro hat folgendes geschrieben:
Sicher ?

using System.Management; gibt bei mir nicht ? Das einzigste was mit M gibt ist Media.

Gruß Arthuro

Fehlt vielleicht eine Reference?
golgol
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 58

Win XP Prof. / Linux
C# (VS 2005)
BeitragVerfasst: Fr 07.12.07 14:14 
Du musst das "System.Management" als Verweis zu deinem Projekt hizufügen, bevor du es mit using verwenden kannst. Den Verweis kannst du über "Projekt -> Verweis hinzufügen" einbinden.
Probier es am besten mal aus, sollte dann auf jeden Fal klappen.
Arthuro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 07.12.07 14:21 
Vielen Danke

Und Searcher und total memory sind was in deinem code snipplet `?
golgol
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 58

Win XP Prof. / Linux
C# (VS 2005)
BeitragVerfasst: Fr 07.12.07 14:28 
Der searcher ist lediglich ein Objekt des Typs ManagementObjectSearcher und ermöglicht es einem auf das WMI von Microsoft zuzugreifen. Die Variable totalMemory beinhaltet am Schluß den Betrag des Arbeitsspeichers in Byte (um auf MB zu kommen also zwei mal durch 1024 dividieren). Die Zeichenkette totalphysicalmemory ist der von Microsoft gewählte Name um aus dem WMI die größe des Arbeitsspeichers abzufragen (falls du das meintes).
Arthuro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 07.12.07 14:53 
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
        void Arbeitsspeicher()
        {
            // Speicherauslastung (in Byte)
            PerformanceCounter perCnt = new PerformanceCounter("Memory""Available Bytes");
            long availableMemory = (Convert.ToInt64(perCnt.NextValue()));

            // Gesamtspeicher (in Byte)
            searcher = new ManagementObjectSearcher("SELECT totalphysicalmemory FROM Win32_ComputerSystem").ToString();
            ManagementObjectCollection res = searcher.Get();
            long totalMemroy = 0;
            foreach (ManagementObject mo in res)
            {
                textBox1.Text = (mo["totalphysicalmemory"].ToString());
                
            }
        }


Wenn ich das so einbinde in meinem Programm.

Ich bin noch kein Experte in C#, ich will nur aus meinem normalen programm Code arbeiten dann mach ich Arbeitsspeicher(); aber was übergeb ich ihm ?
Und mit dem Searcher habe ich noch net ganz verstanden :-) Für das andere hab ich einfach eine Textbox erstmal genommen.

Gruß Arthuro
golgol
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 58

Win XP Prof. / Linux
C# (VS 2005)
BeitragVerfasst: Fr 07.12.07 15:40 
Also den Searcher kannst du dir wie eine Art Client für eine Datenbank vorstellen, der für dich in den Tabellen sucht. Tatsächlich wird halt in Informationsdaten des Windows Betriebssystems gesucht. Die Syntax beim Parameter des Konstruktors ist ja auch nicht zufällig an SQL angelehnt ;)
Der Methode selbst musst du nichts übergeben. Die Aufrufe beziehen sich immer auf den lokalen PC und bedürfen keiner weiteren Parameter.

Zu deinem Code:

1) Ist das der Konstruktor einer Klasse? Wenn nein, dann hast du den Rückgabewert vergessen (also zumindest void musst du einfügen.

2) Du hast in der Methode die Deklaration von searcher vergessen. Wenn du das nicht innerhalb der Klasse getan haben solltest, solltest du vor dem Searcher das ManagementObjectSearcher wieder einfügen. Wenn du es gemacht hast ignorier diesesn Punkt einfach ;)
Arthuro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Fr 07.12.07 16:27 
Vielen Dank erstmal für deine ganzen Hilfe.
Ich hab nur noch 2 Fragen.

Also einmal long totalMemoroy = 0; ? ist doch überflüssig ?
Zweitens ich kriege jetzt hier textBox1.Text = (mo["totalphysicalmemory"].ToString()); wieviel Arbeitsspeicher ich habe.

Wie kriege ich jetzt aber raus wieviel der aktuelle ist ? Also wenn ich jetzt 5 Programme Starte müsste der wert ja kleiner werden. Das was angezeigt wird ist ja nur der maximale das was ich habe ?

Gruß Arthuro
golgol
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 58

Win XP Prof. / Linux
C# (VS 2005)
BeitragVerfasst: Fr 07.12.07 16:57 
Erstmal: Gerne ;)

Naja, eigentlich ist so die sauberste Programmierweise. Auf diese Art initialisiere ich die Variable, sie zeigt also auf eine definierte Speicheradresse und belegt Speicher. Bei C# ist das zwar nicht umbedingt notwendig, aber ich hab es mir bei C/C++ so angewöhnt und bin dabei geblieben.

Stimmt, damit bekommst du den insgesamt vorhanden Arbeitsspeicher heraus. Wenn du den aktuell freien haben möchtest, musst du die andere Funktionsweise von oben verwenden. Ich poste sie dir am Besten hier nochmal:

ausblenden C#-Quelltext
1:
2:
3:
// Speicherauslastung (in Byte)
PerformanceCounter perCnt = new PerformanceCounter("Memory""Available Bytes");
long availableMemory = (Convert.ToInt64(perCnt.NextValue()));


Damit wird immer der aktuelle Stand ermittelt. Ahja: Du kannst der PerformanceCounter ruhig als Klassen-Variable deklarieren und dann bei jedem Methodenaufruf (wenn du sicher gestellt hast, dass perCnt != null ist) einfach mit NextValue() den aktuellen Wert abfragen. Leider ist das erste Initialisieren der PerformanceCounters nämlich recht langsam, was es Zeitaufwändig macht, wenn du es bei jedem Methoden-Aufruf neu erzeugst.

P.S.: Hupps, mir ist jetzt erst der Buchstabendreher bei "totalMemroy" aufgefallen :oops:
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: Fr 07.12.07 17:13 
Das hab ich mal dafür geschrieben: www.delphi-forum.de/viewtopic.php?t=77601
Arthuro Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 23



BeitragVerfasst: Mo 10.12.07 09:31 
Vielen Dank GolGol hat alles besten geklappt.

Gruß Arthuro