Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Problem mit GetProcessAffinityMask [wie verwenden?] (https://www.delphipraxis.net/49782-problem-mit-getprocessaffinitymask-%5Bwie-verwenden-%5D.html)

Daniel G 15. Jul 2005 23:35


Problem mit GetProcessAffinityMask [wie verwenden?]
 
N'Abend alle zusammen,

ich habe da ein kleines Problem mit GetProcessAffinityMask, das mich fast an den Rand des Wahnsinns treibt.

Also, bislang habe ich mir das zusammengesucht:

Delphi-Quellcode:
var
  hProcess: THandle;
  BitMask, SysBitMask: DWord;
begin
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION,true,GetCurrentProcess);
  GetProcessAffinityMask(hProcess, BitMask, SysBitMask);
end;
Nun sollen die Variablen "BitMask" und "SysBitMask" mir sagen, auf welchem Prozessor mein Programm läuft und wie viele Prozessoren mein Programm hat. Jage ich die Variablen aber durch den Debugger, haben sie verdammt große Werte, was ja irgendwie nicht die "BitMask" darstellen kann, oder?

Wie bekomme ich denn nun heraus, auf welchem Prozessor mein Programm läuft und wieviele Prozessoren das System hat? Das wäre wichtig für mich zu wissen, da ich im selben Atemzug auch noch SetProcessAffinityMask verwende und dort dann ja sicherlch dasselbe Problem auftreten wird.

Die "Remarks" habe ich natürlich gelesen und ich befürchte beinahe, dass das, was dort steht, verdammt wichtig ist.

Nur blicke ich da im Moment überhaupt nicht durch. Kann mir wer (mal wieder) helfen?

So long,
Daniel

x000x 16. Jul 2005 01:40

Re: Problem mit GetProcessAffinityMask [wie verwenden?]
 
Moin moin,

versuchs mal mit GetCurrentProcessId :-)

Luckie 16. Jul 2005 03:16

Re: Problem mit GetProcessAffinityMask [wie verwenden?]
 
Du musst die Masken ja noch auswerten, denke ich.

Basilikum 16. Jul 2005 09:49

Re: Problem mit GetProcessAffinityMask [wie verwenden?]
 
Zitat:

Zitat von Daniel G
Delphi-Quellcode:
var
  hProcess: THandle;
  BitMask, SysBitMask: DWord;
begin
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION,true,GetCurrentProcess);
  GetProcessAffinityMask(hProcess, BitMask, SysBitMask);
end;
Nun sollen die Variablen "BitMask" und "SysBitMask" mir sagen, auf welchem Prozessor mein Programm läuft und wie viele Prozessoren mein Programm hat. Jage ich die Variablen aber durch den Debugger, haben sie verdammt große Werte, was ja irgendwie nicht die "BitMask" darstellen kann, oder?

die hohen Werte dürften direkt aus dem Zufallsgenerator (Stack :-)) stammen... bereits dein hProcess dürfte ungültig sein (OpenProcess erwartet einen ProcessID), GetProcessAffinityMask scheitert, *Mask bleiben unverändert...
versuch's mal mit
Delphi-Quellcode:
GetProcessAffinityMask(GetCurrentProcess(),BitMask,SysBitMask)
(GetCurrentProcess liefert ein Pseudo-Handle auf den eigenen Prozess)

Zitat:

Zitat von Daniel G
Wie bekomme ich denn nun heraus, auf welchem Prozessor mein Programm läuft und wieviele Prozessoren das System hat? Das wäre wichtig für mich zu wissen, da ich im selben Atemzug auch noch SetProcessAffinityMask verwende und dort dann ja sicherlch dasselbe Problem auftreten wird.

die Prozessor-Anzahl bekommst Du mit MSDN-Library durchsuchenGetSystemInfo

und die Affinität Deines Programmes wird in der Maske abgebildet... sprich:
Bit 0 gesetzt (Mask and $00000001 > 0) - CPU 1 zugeordnet
Bit 1 gesetzt (Mask and $00000002 > 0) - CPU 2 zugeordnet
(while true do ...)

Olli 16. Jul 2005 09:58

Re: Problem mit GetProcessAffinityMask [wie verwenden?]
 
Wieviele CPUs? -> SYSTEM_INFO an GetSystemInfo() übergeben und auswerten.
Nur konfigurierte CPUs werden ausgegeben!!!

Zitat:

Zitat von Daniel G
Nun sollen die Variablen "BitMask" und "SysBitMask" mir sagen, auf welchem Prozessor mein Programm läuft und wie viele Prozessoren mein Programm hat. Jage ich die Variablen aber durch den Debugger, haben sie verdammt große Werte, was ja irgendwie nicht die "BitMask" darstellen kann, oder?

Bei Bitmasken betrachtet man üblicherweise gerade nicht die "Werte" sondern die gesetzten Bits ...

Bitmask AND 2^0 = Bit0
Bitmask AND 2^1 = Bit1
...
Bitmask AND 2^31 = Bit31

Zitat:

Zitat von Daniel G
Wie bekomme ich denn nun heraus, auf welchem Prozessor mein Programm läuft

Die Affinity Mask eines Prozesses besagt ja gerade auf welchen Prozessoren dein Prozess laufen darf. Üblicherweise dürfte das ein einziges Bit sein. Leider habe ich kein SMP-System :cry:

Edit: :wall: na super, das passiert wenn man zwischendurch telefoniert und trotzdem keine rote Box kommt.

Daniel G 16. Jul 2005 11:02

Re: Problem mit GetProcessAffinityMask [wie verwenden?]
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ähä....

Ok, ich hoffe mal, das ichs jetzt verstanden habe:

@alle, die ein Multi - Prozessorsystem ihr eigen nennen:

Könnt ihr mal das angehängte Programm ausprobieren? Ich habe vier Prozessoren genommen, mich würden mal die Werte für BitMask und SysBitMask bei systemen interessieren, die mehrere Prozessoren besitzen. Wenn ich das richtig umgesetzt habe, dürfte da ja nur 1 oder 0 stehen.

Wär auch gut, wenn ihr den Prozess mal nur auf den zweiten Prozessor legen könntet und mir dann die Werte sagen würdet.

Vielen Dank,
Daniel

P.S.:
Im Archiv ist die fertigkompillierte Echse, habe mir für Testzwecke einfach Luckie's ComboBox - Demo geschnappt. 'Tschuldigung. Hab' aber im QT darauf hingewiesen.

// Edit: Luckie hat die Echse verkleinert...

Daniel Schuhmann 4. Jan 2006 10:57

Re: Problem mit GetProcessAffinityMask [wie verwenden?]
 
Habs auf einem System mit zwei CPUs getestet:

Affinity CPU1+CPU2:
CPU1: BitMask 1, SysBitMask 1
CPU2: BitMask 2, SysBitMask 2
CPU3: BitMask 0, SysBitMask 0
CPU4: BitMask 0, SysBitMask 0

Affinity nur CPU1
CPU1: BitMask 1, SysBitMask 1
CPU2: BitMask 0, SysBitMask 2
CPU3: BitMask 0, SysBitMask 0
CPU4: BitMask 0, SysBitMask 0

Affinity nur CPU2:
CPU1: BitMask 0, SysBitMask 1
CPU2: BitMask 2, SysBitMask 2
CPU3: BitMask 0, SysBitMask 0
CPU4: BitMask 0, SysBitMask 0

devidespe 22. Nov 2012 17:40

AW: Problem mit GetProcessAffinityMask [wie verwenden?]
 
Aus gegebenem Anlass möchte ich dieses Thema nochmal aufgreifen, da Delphi XE3 hier anstatt zwei DWords nun DWord-Pointer zurückliefert:

Delphi-Quellcode:
function GetProcessAffinityMask(hProcess: THandle;
  var lpProcessAffinityMask, lpSystemAffinityMask: DWORD_PTR): BOOL; stdcall;
Nun stellt sich die Frage, wie man das trotzdem in zwei normale DWords überführen kann?

himitsu 22. Nov 2012 18:10

AW: Problem mit GetProcessAffinityMask [wie verwenden?]
 
Wer sagt, daß das Pointer sind?

Schau mal nach wie DWORD_PTR deklariert ist :zwinker:


Tipp: http://msdn.microsoft.com/en-us/library/cc230322.aspx

Delphi-Laie 10. Apr 2013 17:58

AW: Problem mit GetProcessAffinityMask [wie verwenden?]
 
Zitat:

Zitat von himitsu (Beitrag 1192457)
Schau mal nach wie DWORD_PTR deklariert ist :zwinker:

Tipp: http://msdn.microsoft.com/en-us/library/cc230322.aspx

Eine ausführliche Beschreibung dazu findet sich hier.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:02 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz