Entwickler-Ecke

Windows API - Anzahl der CPU's ermitteln


Alice - Sa 31.01.09 19:29
Titel: Anzahl der CPU's ermitteln
hi all,

hiermit meine ich nicht, dass z.b. ein Quad 4cores inne hat, nein.

zb.: auf einem mainboard sind 2 cpu's verbaut, z.b. zwei quads je 4cores.

wie oder wo bekomme ich die info darüber das 2 cpu's verbaut sind?

cu


nagel - Sa 31.01.09 19:33

http://www.delphipraxis.net/topic7462.html


Alice - Sa 31.01.09 19:45

hi,

user profile iconnagel hat folgendes geschrieben Zum zitierten Posting springen:
http://www.delphipraxis.net/topic7462.html


genau diese funk. meinte ich nicht.

diese zeigt mir auf einem quad 4-cores an.
ich will jedoch die *anzahl der verbauten cpu's.
in meinem falle wäre das dann 1.

auf einem board mit 2 verbauten cpu's (also einem board mit 2 cpu sockets)
wären es mit o.g. funk. (2xQuad) 8-cores.

ich suche jedoch die *2* ... und nicht die 8...

cu


nagel - Sa 31.01.09 19:49

Oh sorry, ich hab deine Frage schon richtig verstanden, aber die verlinkte Funktion nicht getestet, sondern dem Beschreibungstext nach gedacht, sie würde die Anzahl zurückgeben.


Webo - Sa 31.01.09 19:52

Also die Funktion funktioniert bei mir:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function GetNumberOfProcessors: Integer;
var
  SystemInfo: TSystemInfo;
begin
  GetSystemInfo(SystemInfo);
  Result:=SystemInfo.dwNumberOfProcessors;
end;


Grüße

Webo

[Edit]: Ich hätt mir den Link anschauen sollen.


Alice - Sa 31.01.09 20:15

hi,

user profile iconWebo hat folgendes geschrieben Zum zitierten Posting springen:
Also die Funktion funktioniert bei mir:
[Edit]: Ich hätt mir den Link anschauen sollen.


ich hoffe du meinst damit, dass es hiermit *nicht geht.
bitte die fragestellung durchlesen.

cu


jaenicke - Sa 31.01.09 20:20

Schau dir mal CxCpu an, ich habe zwar diese Funktionalität dort bisher nicht gesucht, aber alles was mit Informationen zur CPU zu tun hatte konnte ich bisher damit umsetzen.
http://www.torry.net/authorsmore.php?id=1084
Zudem ist es Freeware inkl. Quelltext.


Alice - Sa 31.01.09 20:57

hi,

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Schau dir mal CxCpu an, ich habe zwar diese Funktionalität dort bisher nicht gesucht, aber alles was mit Informationen zur CPU zu tun hatte konnte ich bisher damit umsetzen.
http://www.torry.net/authorsmore.php?id=1084
Zudem ist es Freeware inkl. Quelltext.


ne, ghet leider nicht.

cu


Delete - Sa 31.01.09 23:40

Windows kann nicht ziwschen physischen und virtuellen CPUs unterscheiden. Wenn du also eine quadcore hast, "dent" Windows dies wären auch vier CPUs. Aber viele Hardwareinformationen bekommt man auch über die Setup-API. Evntuell guckst du mal, ob du so die Anzahl der physischen CPUs erhälts. Allerdings weiß ich nicht, wo man an Übersetzungen der Setup-API Header-Dateien kommt.

Was mir gerade noch einfällt, hast du schon mal probiert die Informazionen über WMI zu beziehen?


Alice - So 01.02.09 12:09

hi,

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Windows kann nicht ziwschen physischen und virtuellen CPUs unterscheiden. Wenn du also eine quadcore hast, "dent" Windows dies wären auch vier CPUs. Aber viele Hardwareinformationen bekommt man auch über die Setup-API. Evntuell guckst du mal, ob du so die Anzahl der physischen CPUs erhälts. Allerdings weiß ich nicht, wo man an Übersetzungen der Setup-API Header-Dateien kommt.

Was mir gerade noch einfällt, hast du schon mal probiert die Informazionen über WMI zu beziehen?


bei jedi gibt es diese übersetzung, jedoch konnte ich dort nicht passendes finden.
unter wmi habe ich eben mal nachgesehen, auch hier scheint es keine info darüber zu geben, leider.

cu


GTA-Place - So 01.02.09 15:57

Unter C#.NET soll es wohl so gehen:
http://dotnet-snippets.de/dns/c-anzahl-physikalischer-prozessoren-ermitteln-SID375.aspx

Ist natürlich ohne .NET dann etwas schwierig :lol:


EDIT: Ich kann dir aber eine .NET-DLL zur Verfügung stellen (inklusive Unit zur Verwendung in Delphi ohne .NET). Die DLL muss aber dann über RegASM registriert werden, falls dich das nicht stört.


Kha - So 01.02.09 17:14

user profile iconGTA-Place hat folgendes geschrieben Zum zitierten Posting springen:
Ist natürlich ohne .NET dann etwas schwierig :lol:
System.Management ist doch nur ein .Net-Wrapper der WMI ;) .


GTA-Place - So 01.02.09 17:25

Und warum kann man dann nicht mit WMI direkt arbeiten?


jaenicke - So 01.02.09 17:29

Weil WMI dafür wohl ebenfalls keine Möglichkeit anbietet:
user profile iconAlice hat folgendes geschrieben Zum zitierten Posting springen:
unter wmi habe ich eben mal nachgesehen, auch hier scheint es keine info darüber zu geben, leider.

Ich muss das einmal an einem echten Mehrprozessor-PC ausprobieren, insbesondere was dazu einige Systeminformationsprogramme sagen, deren Funktionsweise ich kenne, aber das geht im Moment nicht. Vermutlich nächste Woche irgendwann.


Motzi - So 01.02.09 18:01

Sollte über die Suche in der Entwickler-Ecke CPUID Instruktion gehen, ist aber etwas kompliziert. Welche Informationen du mit Hilfe der CPUID-Instruktion auslesen kannst findest du hier: http://www.sandpile.org/ia32/cpuid.htm


BenBE - So 01.02.09 19:11

@Motzi: Das funktioniert zwar über CPUID für einen Prozessor (physisch), aber wenn man mehrere drin hat, bekommt man nur für einen die Info. Hier muss man schon über ACPI die Informationen abfragen (d.h. aus dem physikalischen Speicher die Deskriptoren klauben) ...


Kha - So 01.02.09 19:12

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Weil WMI dafür wohl ebenfalls keine Möglichkeit anbietet
Dem .NET-Code nach gibt es eine und die sollte dann natürlich auch unter Delphi verfügbar sein :nixweiss: .


Motzi - So 01.02.09 19:46

user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
@Motzi: Das funktioniert zwar über CPUID für einen Prozessor (physisch), aber wenn man mehrere drin hat, bekommt man nur für einen die Info. Hier muss man schon über ACPI die Informationen abfragen (d.h. aus dem physikalischen Speicher die Deskriptoren klauben) ...

Das ist richtig, aber du kannst zuerst mit GetSystemInfo die Anzahl der Prozessoren abfragen und dann der Reihe nach mit SetThreadAffinityMask festlegen auf welchem Prozessor der Thread laufen soll und für diesen dann per CPUID alle Informationen auslesen.


jaenicke - So 01.02.09 19:56

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Weil WMI dafür wohl ebenfalls keine Möglichkeit anbietet
Dem .NET-Code nach gibt es eine und die sollte dann natürlich auch unter Delphi verfügbar sein :nixweiss: .
Stimmt, ich hatte mich jetzt auf die Aussage verlassen: :oops:
user profile iconAlice hat folgendes geschrieben Zum zitierten Posting springen:
unter wmi habe ich eben mal nachgesehen, auch hier scheint es keine info darüber zu geben, leider.
Aber der Dokumentation nach zu urteilen (und dem Beispiel) stimmt das ja nicht.

WMI Dokumentation zu Win32_Processor [http://msdn.microsoft.com/en-us/library/aa394373.aspx] hat folgendes geschrieben:
On a multiprocessor computer, one instance of the Win32_Processor class exists for each processor.
und
WMI Dokumentation zu Win32_Processor [http://msdn.microsoft.com/en-us/library/aa394373.aspx] hat folgendes geschrieben:
NumberOfCores
Number of cores for the current instance of the processor. A core is a physical processor on the integrated circuit. For example, in a dual-core processor this property has a value of 2. For more information, see Remarks.


Alice - Sa 07.02.09 15:05

hi,

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Weil WMI dafür wohl ebenfalls keine Möglichkeit anbietet
Dem .NET-Code nach gibt es eine und die sollte dann natürlich auch unter Delphi verfügbar sein :nixweiss: .
Stimmt, ich hatte mich jetzt auf die Aussage verlassen: :oops:
user profile iconAlice hat folgendes geschrieben Zum zitierten Posting springen:
unter wmi habe ich eben mal nachgesehen, auch hier scheint es keine info darüber zu geben, leider.
Aber der Dokumentation nach zu urteilen (und dem Beispiel) stimmt das ja nicht.


so, eben mal auf einem serverboard, 2cpus zu je 4cores in der WMI nachgesehen, win2003 server,
hier ist nicht dergleichen zu finden, selbst der CPU-typ wird falsch ausgegeben!?!

aber irgendwie muss das doch gehen, tools wie cpuz zb. erkennen dies ja auch.

cu