Wie Grafikkarten Speicher ermitteln ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von STARGÅTE »

Naja bis darauf, dass hier falsch gerundet wird (vermutlich wegen /1024 statt /1000), scheint der Code zu gehen.
Gibt hier bei mir bei der GPU 5 GB, habe aber 6 GB verbaut.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von TroaX »

Hmmm komisch. Irgendwie sehe ich den Sinn nicht. Dann würde ich einfach durch 1000 rechnen. Abgerundet wird dann von alleine. Kaufmännisch runden macht kein Sinn. Weil dann hätte ich 9 GB. Es ist aber seltsam, das es bei mir auch manuell mit Rechner gerechnet genau herauskommt.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
al90
Beiträge: 1097
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von al90 »

Ergibt bei mir immer alles 0 ausser von Kiffi wenn ich das mit #PB_ASCII mache. dann bekomme ich 512 MB angezeigt so wie es auch sein muss :mrgreen:
Das mit dem anzeigen des speichers ist schon komisch. bei mir zeigt er z.b. 31 statt 32MB (Hauptspeicher) an.
ich behelfe mich dann immer mit dem Einzeiler

Code: Alles auswählen

If (mem.i/2)*2<>mem.i : mem.i+1 : EndIf
Dann stimmt die sache auch wieder :mrgreen:
Ungerade Memorys sind ja auch so viel ich weis garnicht möglich.
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von TroaX »

Dann machen wir das jetzt so:

Code: Alles auswählen

Define VMem.f

VMem = ValF(ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000","HardwareInformation.qwMemorySize",0))/1000000000

If VMem > 1
  VMem = Round(VMem, #PB_Round_Down)
EndIf
Und das Beispiel:

Code: Alles auswählen

Procedure.s ReadRegKey(OpenKey.i,SubKey.s,ValueName.s,Type.i=1)
  hKey.i=0
  DataSize.i=255
  keyvalue$=""
  mem=AllocateMemory(1024)

  If mem
    If RegOpenKeyEx_(OpenKey,SubKey,0,#KEY_READ,@hKey)
      keyvalue$="Error"
    Else
      If RegQueryValueEx_(hKey,ValueName,0,0,mem,@DataSize)
        keyvalue$="Error"
      Else
        If Type=0
          keyvalue$=Str(PeekI(mem))
        ElseIf Type=1
          keyvalue$=PeekS(mem)
        EndIf
      EndIf
      RegCloseKey_(hKey)
    EndIf
    FreeMemory(mem)
  EndIf
  ProcedureReturn keyvalue$
EndProcedure

Procedure.s GetComputerName()
  a$=ComputerName()
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorName()
  a$=CPUName()
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorSpeed()
  a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"HARDWARE\DESCRIPTION\System\CentralProcessor\0","~MHz",0)
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s CountProcessorCores()
  x=CountCPUs()
  ProcedureReturn Str(x)
EndProcedure

Procedure.s GetProcessorArchitecture()
  a$=GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_ARCHITECTURE")
  EndIf
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorIdentifier()
  a$=GetEnvironmentVariable("PROCESSOR_IDENTIFIER")
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_IDENTIFIER")
  EndIf
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorLevel()
  a$=GetEnvironmentVariable("PROCESSOR_LEVEL")
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_LEVEL")
  EndIf
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorRevision()
  a$=GetEnvironmentVariable("PROCESSOR_REVISION")
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_REVISION")
  EndIf
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s GetGraphicCardName()
  Protected device.DISPLAY_DEVICE
  Protected settings.DEVMODE
  device\cb = SizeOf(DISPLAY_DEVICE)
  settings\dmSize = SizeOf(DEVMODE)
  EnumDisplayDevices_(#Null,#Null,device,#Null)
  a$=PeekS(@device\DeviceString)
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0001","DriverDesc")
    If a$=""
      a$="<Unbekannt>"
    EndIf
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.i GetTotalInstalledMemory()
  Protected Info.MEMORYSTATUS
  Info\dwLength = SizeOf(MEMORYSTATUS)
  GlobalMemoryStatus_(@Info)
  ProcedureReturn Info\dwTotalPhys
EndProcedure

Procedure.i GetTotalFreeMemory()
  Protected Info.MEMORYSTATUS
  Info\dwLength = SizeOf(MEMORYSTATUS)
  GlobalMemoryStatus_(@Info)
  ProcedureReturn Info\dwAvailPhys
EndProcedure

Procedure.i GetTotalUsedMemory()
  Protected Info.MEMORYSTATUS
  Info\dwLength = SizeOf(MEMORYSTATUS)
  GlobalMemoryStatus_(@Info)
  ProcedureReturn Info\dwTotalPhys-Info\dwAvailPhys
EndProcedure

Procedure Show_SystemInformations()
  Define VMem.f
  a$=GetComputerName()
  Window_0 = OpenWindow(#PB_Any, 420, 134, 640, 551, "Syseminformationen für "+a$, #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
  If Window_0
    fnt=LoadFont(#PB_Any,"verdana",10,#PB_Font_HighQuality)
    SetGadgetFont(#PB_Default,FontID(fnt))
    Button_1 = ButtonGadget(#PB_Any, 503, 508, 116, 30, "Schließen")
    Container_0 = ContainerGadget(#PB_Any, 21, 19, 598, 477, #PB_Container_Raised)
      Frame_1 = FrameGadget(#PB_Any, 21, 23, 551, 216, "CPU")
      Text_1 = TextGadget(#PB_Any, 36, 41, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_2 = TextGadget(#PB_Any, 36, 68, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_3 = TextGadget(#PB_Any, 36, 95, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_4 = TextGadget(#PB_Any, 36, 122, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_5 = TextGadget(#PB_Any, 36, 149, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_6 = TextGadget(#PB_Any, 36, 176, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_7 = TextGadget(#PB_Any, 36, 203, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Frame_2 = FrameGadget(#PB_Any, 21, 250, 551, 78, "GPU")
      Text_8 = TextGadget(#PB_Any, 36, 268, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_12 = TextGadget(#PB_Any, 36, 295, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Frame_3 = FrameGadget(#PB_Any, 21, 344, 551, 108, "Arbeitsspeicher (Physikalisch)")
      Text_9 = TextGadget(#PB_Any, 36, 362, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_10 = TextGadget(#PB_Any, 36, 389, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_11 = TextGadget(#PB_Any, 36, 416, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      SetGadgetColor(Text_1, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_2, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_3, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_4, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_5, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_6, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_7, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_8, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_9, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_10, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_11, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_12, #PB_Gadget_BackColor, $cccccc)
      SetGadgetText(Text_1, GetProcessorName())
      SetGadgetText(Text_2, GetProcessorSpeed()+" Mhz")
      SetGadgetText(Text_3, CountProcessorCores()+" Cores")
      SetGadgetText(Text_4, "Architecture: "+GetProcessorArchitecture())
      SetGadgetText(Text_5, "Revision: "+GetProcessorRevision())
      SetGadgetText(Text_6, "Identifier: "+GetProcessorIdentifier())
      SetGadgetText(Text_7, "Level: "+GetProcessorLevel())
      SetGadgetText(Text_8, GetGraphicCardName())
      x=GetTotalInstalledMemory()/1024/1024/1024
      If (x/2)*2<>x : x+1 : EndIf
      SetGadgetText(Text_9, "Gesamtspeicher: "+Str(x)+" GB")
      x=GetTotalFreeMemory()/1024/1024/1024
      SetGadgetText(Text_10, "Freier Speicher: "+Str(x)+" GB")
      x=GetTotalUsedMemory()/1024/1024/1024
      SetGadgetText(Text_11, "Belegter Speicher: "+Str(x)+" GB")
      VMem = ValF(ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000","HardwareInformation.qwMemorySize",0))/1000000000
      If VMem > 1
        VMem = Round(VMem, #PB_Round_Down)
      EndIf
      SetGadgetText(Text_12, StrF(VMem) +" GB Video-Memory")
    CloseGadgetList()
  EndIf

  Repeat
    Event=WaitWindowEvent()
    If Event=#PB_Event_Gadget
      gad=EventGadget()
    Else
      gad=0
    EndIf
    If gad=Button_1
      Break
    EndIf
  Until Event=#PB_Event_CloseWindow
EndProcedure

Show_SystemInformations()
Wenn da jetzt unter 1 GB völlig krumme Werte rauskommen, dann wäre es mal gut zu wissen, was für welche. Ich habe keine Graka mit unter 1 GB und kann das dann auch selbst nicht testen.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von ccode_new »

Hallo STARGÅTE

Welcher hexadezimale Wert steht denn bei dir unter:
"#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000","HardwareInformation.qwMemorySize" ?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von STARGÅTE »

Meine Grafikkarte hat Laut Herstellerseite 6 GB.
Mein Grafiktreiber zeigt mir 6128 MB an.
Der Registry-Eintrag gibt den Wert 6425673728 Byte durch 2^20 geteilt wirklich 6128 MB ergibt.
Wenn man aber noch mal durch 2^10 dividiert, kommt 5.984375 raus.
Um nun bei ein Abrunden zu vermeiden reicht es ja durch 1024.0 zu teilen, damit daraus 6 GB wird und nicht 5 GB.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
al90
Beiträge: 1097
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von al90 »

TroaX hat geschrieben:
Zeigt komische werde an bei mir. Dann eher so; dann klappt das auch bei mir. :mrgreen:

Code: Alles auswählen

VMem = ValF(ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000","HardwareInformation.qwMemorySize",0))/1024/1024
      If VMem > 1
        VMem = Round(VMem, #PB_Round_Down)
      EndIf
      SetGadgetText(Text_12, StrF(VMem/1024) +" GB Video-Memory")

Jetzt steht dort 0.5 GB. Also 512 MB ist also richtig soweit. <)

BTW:
Lasse ich die /1024 beim TextGadget weg, bekomme ich genau 512 (MB). Die berechnung stmmt also hargenau.
Zuletzt geändert von al90 am 03.07.2022 23:05, insgesamt 1-mal geändert.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von ccode_new »

Ok!

Eigentlich müsste es ja dann auch 6 Gibibyte statt 6 Gigabyte heißen, oder?
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
TroaX
Beiträge: 661
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Pop_OS! | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Pop_OS!
Wohnort: NRW
Kontaktdaten:

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von TroaX »

Ha ich habe doch noch ein System gefunden, das weniger VRAM hat. Mein neuer Lappi hat ja eine AMD APU. Und hier ist direkt eine Überraschung. Egal was ich mache zeigt er mir immer 0 an. Egal mit welchem Code hier. Denn die APU ist nicht im Schlüssel 0000, sondern unter 0001 hinterlegt. Selbst über die Registry ist das ganze nicht konsistent. Weder was die Zahlen angeht, noch wo die Daten in der Registry hinterlegt sind. Da müsste nach der ersten Abfrage überprüft werden, ob das Ergebnis größer 0 ist. Wenn nicht, muss er sich den Schlüssel 0001 noch einmal holen.

@al90: DIese Lösung ist die erste, die ich gepostet habe. Das Abrunden der If-Abfrage findet praktisch immer statt. Es sei denn jemand hat weniger als 1 MB VRAM. Dann kannste das auch weglassen und die letzten 1024 wieder in die erste Zeile hinter den anderen beiden einsetzen. Und Stargate hat wieder weniger als 6GB ;)
----------
Ich weiß ja nicht, wie wichtig das ist. Aber ich würde es mit der einfachsten mir bekannten Methode machen. Mit dxdiag /x XML-Datei einfach über RunProgram eine XML Datei erstellen, diese mit der XML-Lib parsen lassen und mir da alle Infos herausholen. Da steht eigentlich alles drin. Auch die RAM Daten. Außerdem kannst du damit die Systeminfos puffern und musst diese nicht jedes mal neu aus dem System fischen.

EDIT: Oder man lässt die letzten 1024 weg und zeigt sie in MB an. Dann müsste es ja auch bei Stargate passen. So funktioniert es anscheinend jetzt bei mir:

Code: Alles auswählen

Procedure.s ReadRegKey(OpenKey.i,SubKey.s,ValueName.s,Type.i=1)

  hKey.i=0
  DataSize.i=255
  keyvalue$=""
  mem=AllocateMemory(1024)

  If mem
    If RegOpenKeyEx_(OpenKey,SubKey,0,#KEY_READ,@hKey)
      keyvalue$="Error"
    Else
      If RegQueryValueEx_(hKey,ValueName,0,0,mem,@DataSize)
        keyvalue$="Error"
      Else
        If Type=0
          keyvalue$=Str(PeekI(mem))
        ElseIf Type=1
          keyvalue$=PeekS(mem)
        EndIf
      EndIf
      RegCloseKey_(hKey)
    EndIf
    FreeMemory(mem)
  EndIf

  ProcedureReturn keyvalue$

EndProcedure

Procedure.s GetComputerName()
  a$=ComputerName()
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorName()
  a$=CPUName()
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorSpeed()
  a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"HARDWARE\DESCRIPTION\System\CentralProcessor\0","~MHz",0)
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s CountProcessorCores()
  x=CountCPUs()
  ProcedureReturn Str(x)
EndProcedure

Procedure.s GetProcessorArchitecture()
  a$=GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_ARCHITECTURE")
  EndIf
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorIdentifier()
  a$=GetEnvironmentVariable("PROCESSOR_IDENTIFIER")
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_IDENTIFIER")
  EndIf
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorLevel()
  a$=GetEnvironmentVariable("PROCESSOR_LEVEL")
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_LEVEL")
  EndIf
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s GetProcessorRevision()
  a$=GetEnvironmentVariable("PROCESSOR_REVISION")
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment","PROCESSOR_REVISION")
  EndIf
  If a$=""
    a$="<Unbekannt>"
  EndIf
  ProcedureReturn a$
EndProcedure

Procedure.s GetGraphicCardName()

  Protected device.DISPLAY_DEVICE
  Protected settings.DEVMODE
  device\cb = SizeOf(DISPLAY_DEVICE)
  settings\dmSize = SizeOf(DEVMODE)
  EnumDisplayDevices_(#Null,#Null,device,#Null)
  a$=PeekS(@device\DeviceString)
  If a$=""
    a$=ReadRegKey(#HKEY_LOCAL_MACHINE,"HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0001","DriverDesc")
    If a$=""
      a$="<Unbekannt>"
    EndIf
  EndIf

  ProcedureReturn a$

EndProcedure


Procedure.i GetTotalInstalledMemory()
  Protected Info.MEMORYSTATUS
  Info\dwLength = SizeOf(MEMORYSTATUS)
  GlobalMemoryStatus_(@Info)
  ProcedureReturn Info\dwTotalPhys
EndProcedure

Procedure.i GetTotalFreeMemory()
  Protected Info.MEMORYSTATUS
  Info\dwLength = SizeOf(MEMORYSTATUS)
  GlobalMemoryStatus_(@Info)
  ProcedureReturn Info\dwAvailPhys
EndProcedure

Procedure.i GetTotalUsedMemory()
  Protected Info.MEMORYSTATUS
  Info\dwLength = SizeOf(MEMORYSTATUS)
  GlobalMemoryStatus_(@Info)
  ProcedureReturn Info\dwTotalPhys-Info\dwAvailPhys
EndProcedure

Procedure Show_SystemInformations()

  a$=GetComputerName()
  Window_0 = OpenWindow(#PB_Any, 420, 134, 640, 551, "Syseminformationen für "+a$, #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
  If Window_0
    fnt=LoadFont(#PB_Any,"verdana",10,#PB_Font_HighQuality)
    SetGadgetFont(#PB_Default,FontID(fnt))
    Button_1 = ButtonGadget(#PB_Any, 503, 508, 116, 30, "Schließen")
    Container_0 = ContainerGadget(#PB_Any, 21, 19, 598, 477, #PB_Container_Raised)
      Frame_1 = FrameGadget(#PB_Any, 21, 23, 551, 216, "CPU")
      Text_1 = TextGadget(#PB_Any, 36, 41, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_2 = TextGadget(#PB_Any, 36, 68, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_3 = TextGadget(#PB_Any, 36, 95, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_4 = TextGadget(#PB_Any, 36, 122, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_5 = TextGadget(#PB_Any, 36, 149, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_6 = TextGadget(#PB_Any, 36, 176, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_7 = TextGadget(#PB_Any, 36, 203, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Frame_2 = FrameGadget(#PB_Any, 21, 250, 551, 78, "GPU")
      Text_8 = TextGadget(#PB_Any, 36, 268, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_12 = TextGadget(#PB_Any, 36, 295, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Frame_3 = FrameGadget(#PB_Any, 21, 344, 551, 108, "Arbeitsspeicher (Physikalisch)")
      Text_9 = TextGadget(#PB_Any, 36, 362, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_10 = TextGadget(#PB_Any, 36, 389, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      Text_11 = TextGadget(#PB_Any, 36, 416, 522, 25, "", #PB_Text_Border|#PB_Text_Center)
      SetGadgetColor(Text_1, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_2, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_3, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_4, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_5, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_6, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_7, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_8, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_9, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_10, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_11, #PB_Gadget_BackColor, $cccccc)
      SetGadgetColor(Text_12, #PB_Gadget_BackColor, $cccccc)
      SetGadgetText(Text_1, GetProcessorName())
      SetGadgetText(Text_2, GetProcessorSpeed()+" Mhz")
      SetGadgetText(Text_3, CountProcessorCores()+" Cores")
      SetGadgetText(Text_4, "Architecture: "+GetProcessorArchitecture())
      SetGadgetText(Text_5, "Revision: "+GetProcessorRevision())
      SetGadgetText(Text_6, "Identifier: "+GetProcessorIdentifier())
      SetGadgetText(Text_7, "Level: "+GetProcessorLevel())
      SetGadgetText(Text_8, GetGraphicCardName())
      x=GetTotalInstalledMemory()/1024/1024
      If (x/2)*2<>x : x+1 : EndIf
      SetGadgetText(Text_9, "Gesamtspeicher: "+Str(x)+" MB")
      x=GetTotalFreeMemory()/1024/1024
      SetGadgetText(Text_10, "Freier Speicher: "+Str(x)+" MB")
      x=GetTotalUsedMemory()/1024/1024
      SetGadgetText(Text_11, "Belegter Speicher: "+Str(x)+" MB")
      x = Val(ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0000","HardwareInformation.qwMemorySize",0))/1024/1024
      If x = 0
        x = Val(ReadRegKey(#HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Class\{4d36e968-e325-11ce-bfc1-08002be10318}\0001","HardwareInformation.qwMemorySize",0))/1024/1024
      EndIf
      SetGadgetText(Text_12, Str(x) +" MB Video-Memory")
    CloseGadgetList()
  EndIf

  Repeat

    Event=WaitWindowEvent()
    If Event=#PB_Event_Gadget
      gad=EventGadget()
    Else
      gad=0
    EndIf
    If gad=Button_1
      Break
    EndIf

  Until Event=#PB_Event_CloseWindow

EndProcedure

Show_SystemInformations()
Bild
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Pop_OS!
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Pop_OS!
NAS: Fritz.Box :lol:
Coding: Purebasic 6.04 | PHP | HTML | CSS | Javascript
Benutzeravatar
al90
Beiträge: 1097
Registriert: 06.01.2005 23:15
Kontaktdaten:

Re: Wie Grafikkarten Speicher ermitteln ?

Beitrag von al90 »

TroaX hat geschrieben:
Ja so Funktioniert es jetzt bei mir auch. :allright:
Werde mir das mal morgen genauer ansehen. Ist heute was spät geworden für mich.
/1024 werde ich aber wohl noch rein machen. Finde die anzeige in GB halt einfach übersichtlicher. :mrgreen:
Alternativ könnte man aber auch noch eine CheckBox einbauen wo man zwichen MB & GB switchen kann.
Zumindes bei der GraKa sähe das mit 512 MB besser aus als 0.5 GB :mrgreen:
Antworten