![]() |
Re: Externe Exe starten und dieser einen best. Kern zuweisen
Großes Dankeschön, ich schaus mir mal an!
Mein Problem war es ja ans ProzessHandle zu kommen :? Werd mich nochmal melden wenn es Probleme geben sollte... |
Re: Externe Exe starten und dieser einen best. Kern zuweisen
CreateProcess liefert dir sicher ein ProcessHandle.
|
Re: Externe Exe starten und dieser einen best. Kern zuweisen
Zitat:
Bei Multi-Core Systemen mit mehr als 2 Kernen und wo man möglicherweise mehrere Kerne gleichzeitig Ansprechen will leider nicht. denn bei "iProcessorNumb" wird nicht die anzahl der Kerne direkt angegeben, sondern einen Wert mit dem auch alle Kerne Gleichzeitig angesprochen werden können. Aber dein code hat mich angespornt das mal genau anzusehen :D Hier mein Vorschlag zu CreateProcessCPUKernel:
Delphi-Quellcode:
hier mein Vorschlag zu SetProcessCPUKernelByID:
function CreateProcessCPUKernel(lpProcessName, lpProcessParams: PChar; iCoreVal: Cardinal; iCreationFlags: Cardinal = NORMAL_PRIORITY_CLASS): LongBool;
var SUInfo: TStartupInfo; PIInfo: TPRocessInformation; lpSystemInfo: TSystemInfo; i, CoreValue: Cardinal; begin Result := False; CoreValue:=0; FillChar(SUInfo, sizeof(SUInfo), #0); FillChar(PIInfo, sizeof(PIInfo), #0); GetSystemInfo(lpSystemInfo); for i:=0 to lpSystemInfo.dwNumberOfProcessors-1 do CoreValue:=CoreValue+(1 shl i); if iCoreVal > CoreValue then iCoreVal:=CoreValue; if CreateProcess(lpProcessName, lpProcessParams, nil, nil, false, iCreationFlags or PROCESS_SET_INFORMATION, nil, PChar(ExtractFilePath(lpProcessName)), SUInfo, PIInfo) then begin Result := SetProcessAffinityMask(PIInfo.hProcess, iCoreVal); end; end;
Delphi-Quellcode:
und zu guter letzt die funktion GetProcessID:
function SetProcessCPUKernelByID(lpProcId, iCoreVal: Cardinal):LongBool;
var hProc, i, CoreValue: Cardinal; lpSystemInfo: TSystemInfo; begin Result := False; CoreValue:=0; if (not lpProcId <> 0) then exit; hProc := OpenProcess(PROCESS_ALL_ACCESS or PROCESS_SET_INFORMATION, not true, lpProcId); if hProc <> 0 then begin GetSystemInfo(lpSystemInfo); for i:=0 to lpSystemInfo.dwNumberOfProcessors-1 do CoreValue:=CoreValue+(1 shl i); if iCoreVal > CoreValue then iCoreVal:=CoreValue; Result := SetProcessAffinityMask(hProc, iCoreVal); CloseHandle(hProc); end; end;
Delphi-Quellcode:
ich denke mal das es auch eine andere methode gibt, aber da die funktion ja schon da war, dachte ich, warum soll ich die nicht ändern ;)
uses Tlhelp32;
function GetProcessID(const aFileName: string): integer; var hProcSnap: THandle; pe32: TProcessEntry32; aFile: string; begin result:= 0; aFile:=ExtractFileName(aFileName); hProcSnap := CreateToolHelp32SnapShot(TH32CS_SNAPPROCESS, 0); if hProcSnap = INVALID_HANDLE_VALUE then exit; pe32.dwSize := SizeOf(ProcessEntry32); if Process32First(hProcSnap, pe32) then begin while Process32Next(hProcSnap, pe32) do begin if lowerCase(pe32.szExeFile) = lowercase(aFile) then begin result:= pe32.th32ProcessID; break; end; end; end; CloseHandle(hProcSnap); end; hoffe du bist nicht böse, dass ich deinen code verändert habe. bin gerne für änderungen und vorschläge offen, da ich nich relativ neu bin und mir deswegen leider öfter fehler unterlaufen ;) |
AW: Externe Exe starten und dieser einen best. Kern zuweisen
Der Code hat einen kleinen fehler:
hier: if iKernelNumb > lpSystemInfo.dwNumberOfProcessors richtig: if iKernelNumb > power(2,lpSystemInfo.dwNumberOfProcessors-1) an anderer Stelle nochmals dasselbe. ansonsten sehr nützlicher Code! |
AW: Externe Exe starten und dieser einen best. Kern zuweisen
Delphi-Quellcode:
if iKernelNumb > power(2,lpSystemInfo.dwNumberOfProcessors-1)
kann man auch einfacher schreiben:
Delphi-Quellcode:
if iKernelNumb > 1 shl (lpSystemInfo.dwNumberOfProcessors-1)
|
AW: Externe Exe starten und dieser einen best. Kern zuweisen
Zitat:
|
AW: Externe Exe starten und dieser einen best. Kern zuweisen
Dieses IF ist schon richtig so.
> Wenn der Kernel-Index größer als die Anzahl ist, dann auf den letzten Kern setzen. Aber die nachfolgende Umrechnung von "Index" auf "Maske" fehlte.
Delphi-Quellcode:
Wobei ich es etwas unpraktisch finde, daß man hier einen 1-basierenden Index verwendet.
if iKernelNumb > lpSystemInfo.dwNumberOfProcessors then
iKernelNumb := lpSystemInfo.dwNumberOfProcessors; if SetProcessAffinityMask(hProc, $1 shl (iKernelNumb - 1)) then |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 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