![]() |
Anzahl der CPU (Nicht Kerne/Cores) bestimmen
Wie kann ich die Anzahl der Physikalischen Kerne über die WinAPI bekommen?
Die einfachen Lösungen über TSystemInfo und Co. liefern leider immer nur die Anzahl der Kerne :-( |
AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
Meinst du eventuell sowas hier ?
![]() oder hier das ![]() Grüße |
AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
Zitat:
Beim zweiten Eintrag bekomme ich in der Funktion CountCPUs die Wert CpuCount.Log = 24 CpuCount.LogPerCore = 32 CpuCount.CorePerPhys = 16 auf einem XEON 2-Sockel-System bei der erstein Eintrag bekomme ich GetCPUCount = 24 GetCPULogicalProcessorCount = 32 Auf meinem i7 sind die Werte: 8/16/1 bzw 8/16 Also nix mit Mein i7-System: 1 CPU/Sockel. Xeon-System mit 2 Sockeln: 2 CPU/Sockel :-( |
AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
![]() Vielleicht gibt es auch ein entsprechendes WMI command das in Delphi genutzt werden kann? Grüße Klaus |
AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
Hi,
bei einigen CPU-Typen kannst Du über CPUID die serial number der CPU auslesen - dann musst Du nur noch über alle Threads die SNs sammeln aber eine allumfassende Lösung für alle CPUs wirds da nicht geben, Du kannst auch über die Infos , die Du über CPUID gewinnst, in Deiner (selbst zu erstellenden) DB nachschauen, wie beim jeweiligen Typ das Verhältniss Core per Socket ist btw. ich glaube mich zu erinnern, dass es mal CPUs gab, die 2 Dies pro Sockel hatten evtl. hilft auch UEFI (geschrieben in voller Unkenntnis aller Tatsachen) mfg |
AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
Ich habe noch diesen Beitrag gefunden:
![]() Dort wird die Klasee ![]() Mit dem Class-Generator kann man sich auch eine sehr leicht eine angepasste Win32_Processor Klasse für Delphi oder andere Sprachen erstellen. Zum direkten Testen ist der Codegenerator am besten: ![]() Und für Klassen zu erstellen gibt es: ![]() Eine ![]() Hier noch was ![]() Dort speziell dieser Abschnitt: Zitat:
|
AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
![]()
Delphi-Quellcode:
// uses ActiveX, comobj,
Procedure CPU; const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : OLEVariant; oEnum : IEnumvariant; iValue : LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_Processor','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Form1.Memo1.lines.add(Format(' Processor Id : %s',[String(FWbemObject.ProcessorId)])); Form1.Memo1.lines.add(Format(' Max Clock Speed : %d',[Integer(FWbemObject.MaxClockSpeed)])); Form1.Memo1.lines.add(Format(' NumberOfCores : %d', [Integer(FWbemObject.NumberOfCores)])); Form1.Memo1.lines.add(Format(' NumberOfLogicalProcessors : %d', [Integer(FWbemObject.NumberOfLogicalProcessors)])); //...und so weiter...:wink: FWbemObject:=Unassigned; end; end; |
AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
Eine weitere Idee ist, ob man nicht vielleicht an die DMI Prozessor-Information über SMBios da rankommt. Da ich keinen Computer mit 2 Sockeln habe, kann es nicht ausprobieren. Aber vielleicht kann jemand das Programm Everest mal auf einem 2 CPU Sockel starten und mal unter "Computer->DMI->Prozessoren" reinschauen, ob da 2 getrennte CPU angezeigt werden. Falls ja ist die Wahrscheinlichkeit hoch, dass man es über SMBios Daten rauskriegt.
Lg, jus |
AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
Zitat:
|
AW: Anzahl der CPU (Nicht Kerne/Cores) bestimmen
Also bei mir liefert die Win32_ComputerSystem Klasse den richtigen Wert.
Delphi-Quellcode:
Win32_ComputerSystem:
//uses ...ActiveX, ComObj, Variants, windows;
procedure CPU2; const wbemFlagForwardOnly = $00000020; var FSWbemLocator : OLEVariant; FWMIService : OLEVariant; FWbemObjectSet: OLEVariant; FWbemObject : Variant;// OLEVariant; oEnum : IEnumvariant; iValue : PULONG;//LongWord; begin; FSWbemLocator := CreateOleObject('WbemScripting.SWbemLocator'); FWMIService := FSWbemLocator.ConnectServer('localhost', 'root\cimv2', '', ''); FWbemObjectSet:= FWMIService.ExecQuery('SELECT * FROM Win32_ComputerSystem','WQL',wbemFlagForwardOnly); oEnum := IUnknown(FWbemObjectSet._NewEnum) as IEnumVariant; while oEnum.Next(1, FWbemObject, iValue) = 0 do begin Form1.Memo1.lines.add(Format(' NumberOfLogicalProcessors : %d', [Integer(FWbemObject.NumberOfLogicalProcessors)])); Form1.Memo1.lines.add(Format(' NumberOfProcessors : %d', [Integer(FWbemObject.NumberOfProcessors)])); FWbemObject:=Unassigned; end; end;
Code:
Win32_Processor:
NumberOfLogicalProcessors : 2
NumberOfProcessors : 1 <--
Code:
Die Abfrage mit Win32_ComputerSystem kommt mir auch weniger verzögert vor.
NumberOfCores : 2
NumberOfLogicalProcessors : 2 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz