Autor |
Beitrag |
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Mo 30.12.13 19:30
Hallo allerseits !
ich sehe nicht, warum der folgende Code nicht funktioniert:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| Var Form1 : TForm1; Memory : TMemoryStatus;
Implementation
{$R *.dfm}
Procedure TForm1.FormCreate(Sender: TObject); Begin Memory.dwLength := SizeOf(Memory); GlobalMemoryStatus(Memory); Memo1.lines.Clear; Memo1.Lines.Add ('Memory total: ' + IntToStr(Memory.dwTotalPhys div 1048576) + ' MB'); Memo1.Lines.Add ('Memory free : ' + IntToStr(Memory.dwAvailPhys div 1048576) + ' MB'); End; |
Als Ergebnisse sehe ich immer 2047 MB ! Habe ich vergessen, etwas korrekt zu initialisieren ?
Danke für jede Antwort !
Hochhaus
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 30.12.13 20:20
Wozu die globale Variable... du benutzt sie doch nur lokal, da gibt es für so unsauberen Code doch absolut keinen Grund...
Aber zum Problem:
Wenn du die Dokumentation lesen würdest, wüsstest du wo das Problem liegt... msdn.microsoft.com/e...366586(v=vs.85).aspx hat folgendes geschrieben: | On Intel x86 computers with more than 2 GB and less than 4 GB of memory, the GlobalMemoryStatus function will always return 2 GB in the dwTotalPhys member of the MEMORYSTATUS structure. Similarly, if the total available memory is between 2 and 4 GB, the dwAvailPhys member of the MEMORYSTATUS structure will be rounded down to 2 GB. |
Und als Lösung:
// EDIT:
Sprich korrekt: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.FormCreate(Sender: TObject); var Memory: TMemoryStatusEx; begin Memory.dwLength := SizeOf(Memory); if GlobalMemoryStatusEx(Memory) <> 0 then begin Memo1.Lines.Clear; Memo1.Lines.Add('Memory total: ' + IntToStr(Memory.ullTotalPhys div 1048576) + ' MB'); Memo1.Lines.Add('Memory free : ' + IntToStr(Memory.ullAvailPhys div 1048576) + ' MB'); end else Memo1.Text := SysErrorMessage(GetLastError); end; |
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Mo 30.12.13 20:36
jaenicke hat folgendes geschrieben : |
// EDIT:
Sprich korrekt: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| procedure TForm1.FormCreate(Sender: TObject); var Memory: TMemoryStatusEx; begin Memory.dwLength := SizeOf(Memory); if GlobalMemoryStatusEx(Memory) <> 0 then begin Memo1.Lines.Clear; Memo1.Lines.Add('Memory total: ' + IntToStr(Memory.ullTotalPhys div 1048576) + ' MB'); Memo1.Lines.Add('Memory free : ' + IntToStr(Memory.ullAvailPhys div 1048576) + ' MB'); end else Memo1.Text := SysErrorMessage(GetLastError); end; | |
Das habe ich schon probiert . . . der Compiler quittiert dies mit der Fehlermeldung -->
[Fehler] UNIT1.PAS(39): Undefinierter Bezeichner: 'TMemoryStatusEx'
Hochhaus
|
|
FinnO
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Mo 30.12.13 20:41
Moin,
versuch doch den TMemoryStatusEx-Struct (als Record) selbst zu bauen:
Siehe Doku:
msdn.microsoft.com/e...366770(v=vs.85).aspx
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| type DWORDLONG = Int64; type PMemoryStatusEx = ^TMemoryStatusEx; LPMEMORYSTATUSEX = PMemoryStatusEx; {$EXTERNALSYM LPMEMORYSTATUSEX} _MEMORYSTATUSEX = packed record dwLength : DWORD; dwMemoryLoad : DWORD; ullTotalPhys : DWORDLONG; ullAvailPhys : DWORDLONG; ullTotalPageFile: DWORDLONG; ullAvailPageFile: DWORDLONG; ullTotalVirtual : DWORDLONG; ullAvailVirtual : DWORDLONG; end; {$EXTERNALSYM _MEMORYSTATUSEX} TMemoryStatusEx = _MEMORYSTATUSEX; MEMORYSTATUSEX = _MEMORYSTATUSEX; {$EXTERNALSYM MEMORYSTATUSEX} | [1]
Gruß
Zuletzt bearbeitet von FinnO am Mo 30.12.13 20:42, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: Hochhaus
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 30.12.13 20:41
Dann kennt deine Delphiversion den Typ noch nicht, den brauchst du ja nur aus der Dokumentation abschreiben... Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TMemoryStatusEx = record dwLength: DWORD; dwMemoryLoad: DWORD; ullTotalPhys: UInt64; ullAvailPhys: UInt64; ullTotalPageFile: UInt64; ullAvailPageFile: UInt64; ullTotalVirtual: UInt64; ullAvailVirtual: UInt64; ullAvailExtendedVirtual: UInt64; end;
function GlobalMemoryStatusEx(var lpBuffer : TMemoryStatusEx): BOOL; stdcall; external kernel32 name 'GlobalMemoryStatusEx'; | //EDIT:
ok, ein paar Sekunden zu spät...
// EDIT2:
Ach ja, bei mir ist die Definition (so ähnlich) in der Unit Windows drin.
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Mo 30.12.13 20:49
... Der Compiler reklamiert beim Typ UInt64 ... Offenbar muss ich Delphi 6 PE definitiv beerdigen.
Hochhaus
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 30.12.13 20:51
Nimm Int64... da dort keine negativen Werte vorkommen und der RAM auch nicht so groß sein kann, dass die Grenzen von Int64 erreicht werden, sollte das auch gehen.
// EDIT:
Da bei dir im Profil Delphi XE2 steht, verstehe ich allerdings ohnehin nicht so recht was du noch mit Delphi 6 machst...
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Mo 30.12.13 21:00
[quote=" jaenicke"(682779)
Da bei dir im Profil Delphi XE2 steht, verstehe ich allerdings ohnehin nicht so recht was du noch mit Delphi 6 machst... [/quote]
... Programme für ältere OS wie Win2000 ...
Scherz beiseite: Jetzt kompiliert das Programm fehlerfrei, und liefert mir zufällige Werte für den Speicher (siehe Beilage Memory.jpg)
Einloggen, um Attachments anzusehen!
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 30.12.13 21:50
Hochhaus hat folgendes geschrieben : | Scherz beiseite: Jetzt kompiliert das Programm fehlerfrei, und liefert mir zufällige Werte für den Speicher (siehe Beilage Memory.jpg) |
Vergleich doch einmal mit dem Taskmanager. Wenn du ein 32-Bit Betriebssystem hast, sehen die doch korrekt aus...
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 31.12.13 02:28
Ok. Ich habe ein 32-Bit-System. Aber warum ist das korrekt ? Ich habe doch 4 GB Speicher ...! Kann der Prozessor die in diesem Fall nicht komplett adressieren ?
Hochaus
P.S. In den Windows-Systeminformationen kommen 4 GB vor.
Aber Du hast recht: Im Taskmanager sind die Zahlen dieselben. Nur unter "Installiert" kommt 4 GB.
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 31.12.13 09:51
Das Grafik-ROM wird immer in den oberen RAM-Bereich geladen.
Bei nicht-dedizierten Grafikkarten liegt auch der Grafikspeicher im RAM.
Was dann übrig bleibt, ist das "Memory total".
Shared-Memory-Technologie bei Grafikkarten
de.wikipedia.org/wiki/Grafikkarte
de.wikipedia.org/wiki/Shared_Memory
de.wikipedia.org/wiki/Intel_GMA
de.wikipedia.org/wik..._Memory_Architecture
Zuletzt bearbeitet von hathor am Di 31.12.13 10:59, insgesamt 1-mal bearbeitet
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 31.12.13 10:02
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 31.12.13 11:51
Ok. Wieder etwas dazugelernt. Wie ich gesehen habe, wird auf meinem Notebook - mit 64 Bit-Betriebssystem - der ganze Speicher von 8 GB erkannt und angegeben. Ich verwende als Desktop einen Core-2-Duo mit 2.83 GHz von HP Compaq - und als Notebook einen HP mit Core-I7-Prozessor bei 2.2 GHz. Auf beiden läuft Win7 - einmal 32 Bit und einmal 64 Bit.
Hochhaus
Nachtrag: Offenbar ist eine Graphikkarte mit eigenem RAM von Vorteil ...
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 31.12.13 12:03
Hochhaus hat folgendes geschrieben : | Nachtrag: Offenbar ist eine Graphikkarte mit eigenem RAM von Vorteil ... |
Das sowieso, einerseits ist das viel schneller (abgesehen von integrierten APUs, die sind auch recht schnell) und andererseits steht entsprechend mehr RAM zur Verfügung, wenn der nicht durch die Grafikkarte benutzt wird.
Bei einem 32-Bit Betriebssystem kann die Grafikkarte aber unter Umständen den RAM nutzen, der von Windows ohnehin nicht genutzt werden kann, wenn man mehr als den nutzbaren RAM hat.
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 31.12.13 12:14
Noch eine Frage: Wieviel RAM genau kann ein 32-Bit-Betriebssystem maximal adressieren ? 2 hoch 32 Bit ?
Hochhaus
In dem Falle wäre der Adressbereich eines 64-Bit-Systems aber gewaltig und kann wohl nie verwendet werden .
|
|
jaenicke
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 31.12.13 13:44
Adressieren könnte man die 4 GiB, ja. Maximal nutzbar ohne PAE sind etwa die 3,5 GiB, die du dort auch stehen hast.
Bei 64-Bit Betriebssystemen hat man höhere Grenzen, aber trotzdem ist es nicht so viel wie es zunächst scheint. Windows 7 Home Premium unterstützt 16 GiB, ab der Pro sind es 192 GiB, Windows 8 Professional kann 512 GiB und Server 2012 Standard z.B. 4 TiB. Das sind aber alles Softwarelimits.
Und da es heute schon Serversysteme mit hunderten GiB RAM gibt, glaube ich nicht, dass die 64-Bit Grenze nie erreicht wird.
|
|
Xion
Beiträge: 1952
Erhaltene Danke: 128
Windows XP
Delphi (2005, SmartInspect), SQL, Lua, Java (Eclipse), C++ (Visual Studio 2010, Qt Creator), Python (Blender), Prolog (SWIProlog), Haskell (ghci)
|
Verfasst: Di 31.12.13 13:54
Hochhaus hat folgendes geschrieben : | Noch eine Frage: Wieviel RAM genau kann ein 32-Bit-Betriebssystem maximal adressieren ? 2 hoch 32 Bit ? |
Nicht bit, sondern Byte! Du kannst deinen Speicher nicht bit-adressieren. Es sind also 2^32 Byte maximal (mit Einschränkungen, siehe vorherigen Post).
_________________ a broken heart is like a broken window - it'll never heal
In einem gut regierten Land ist Armut eine Schande, in einem schlecht regierten Reichtum. (Konfuzius)
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Di 31.12.13 13:58
Ich glaube auch, dass 2^64 Byte sehr lange ausreichen werden. Aber in der Tat: Als man vor 30 Jahren MS-DOS erfand, glaubte man, dass ein 16-Bit OS längstens ausreicht. Und heute sind 32 Bit nicht mehr genug. Daher kann man nicht wissen, was bis in weiteren 30 Jahren passiert .. Vielleicht gibt es dann Licht- und/oder Quantencomputer.
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 31.12.13 15:49
Nur mal so am Rande:
Ich könnte mir vorstellen, dass es bald bildgebende Ultraschallgeräte mit WLAN (nicht größer als ein Wasserglas) für den "Hausgebrauch" gibt.
Einfache US-Geräte gibt es schon, die können z.Zt. aber nur den Herzschlag des Kindes im Uterus detektieren und in Schall umwandeln.
Wenn man aber ein 3D-Bild vom gleichen Objekt haben will, braucht man schon ein bisschen mehr "Rechenpower".
Einsatzgebiet: DoItYourself Vorsorgeuntersuchungen zuhause:
- von den Brüsten - Jede achte bis zehnte Frau erkrankt im Laufe ihres Lebens an Brustkrebs.
- von der Aorta (Aneurysma) und anderen Arterien, z.B. am Hals und im Oberschenkel (Stenosen)
- vom Herzen
- innere Organe
|
|
drstar
Beiträge: 79
Erhaltene Danke: 2
Windows 8.1/x64
Delphi 10.1
|
Verfasst: So 17.04.16 18:26
Hochhaus hat folgendes geschrieben : | Ok. Ich habe ein 32-Bit-System. Aber warum ist das korrekt ? Ich habe doch 4 GB Speicher ...! Kann der Prozessor die in diesem Fall nicht komplett adressieren ?
Hochaus
[...]
|
Nun, es muß zwischen Betriebssystem und Anwendung unterschieden werden. Bei x86-32 kann das OS max. 4 GByte verwalten (2^32 Byte), dabei stehen je nach Hardware jedoch nur 3,25 bis 3,5 GByte effektiv zur Verfügung. Bei der 32-Bit-Architektur kann eine Anwendung jedoch nur max. 2 GByte nutzen, und genau diese 2047 MByte bekommst Du ja auch angezeigt.
|
|