Entwickler-Ecke
Sonstiges (.NET) - Arbeitsspeicher ermitteln
Arthuro - Fr 07.12.07 13:35
Titel: Arbeitsspeicher ermitteln
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
Christian S.: Topic aus C# - Die Sprache verschoben am Fr 07.12.2007 um 12:40
golgol - 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.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| PerformanceCounter perCnt = new PerformanceCounter("Memory", "Available Bytes"); long availableMemory = (Convert.ToInt64(perCnt.NextValue()));
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:
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 - 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 - Fr 07.12.07 14:02
Arthuro hat folgendes geschrieben: |
Bei mir fehlt ein using welches using ist den für ManagementObjectSearcher ? |
System.Management
Arthuro - 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 - Fr 07.12.07 14:13
Arthuro 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 - 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 - Fr 07.12.07 14:21
Vielen Danke
Und Searcher und total memory sind was in deinem code snipplet `?
golgol - 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 - Fr 07.12.07 14:53
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| void Arbeitsspeicher() { PerformanceCounter perCnt = new PerformanceCounter("Memory", "Available Bytes"); long availableMemory = (Convert.ToInt64(perCnt.NextValue()));
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 - 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 - 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 - 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:
C#-Quelltext
1: 2: 3:
| 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:
Arthuro - Mo 10.12.07 09:31
Vielen Dank GolGol hat alles besten geklappt.
Gruß Arthuro
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!