function ExecuteProcess(FileName: string; Visibility: Integer; BitMask: Integer; Synch: Boolean): Longword;
//valori di Visibility:
{
Value Meaning
SW_HIDE :Hides the window and activates another window.
SW_MAXIMIZE :Maximizes the specified window.
SW_MINIMIZE :Minimizes the specified window and activates the next top-level window in the Z order.
SW_RESTORE :Activates and displays the window. If the window is minimized or maximized,
Windows restores it to its original size and position. An application should
specify this flag when restoring a minimized window.
SW_SHOW :Activates the window and displays it in its current size and position.
SW_SHOWDEFAULT :Sets the show state based on the SW_ flag specified in the STARTUPINFO
structure passed to the CreateProcess function by the program that started the application.
SW_SHOWMAXIMIZED :Activates the window and displays it as a maximized window.
SW_SHOWMINIMIZED :Activates the window and displays it as a minimized window.
SW_SHOWMINNOACTIVE :Displays the window as a minimized window. The active window remains active.
SW_SHOWNA :Displays the window in its current state. The active window remains active.
SW_SHOWNOACTIVATE :Displays a window in its most recent size and position. The active window remains active.
SW_SHOWNORMAL :Activates and displays a window. If the window is minimized or maximized,
Windows restores it to its original size and position. An application should specify this
flag when displaying the window for the first time.
}
//FileName: the name of the program I want to launch
//Bitmask: specifies the set of CPUs on wich I want to run the program
//the BitMask is built in the following manner:
//I have a bit sequence: every bit is associated to a CPU (from right to left)
//I set the bit to 1 if I want to use the corrisponding CPU, 0 otherwise
//for example: I have 4 processor and I want to run the specified process on the CPU 2 and 4:
//the corresponding bitmask will be 1010 -->2^0 * 0 + 2^1 * 1 + 2^2 * 0 + 2^3 * 1 = 2 + 8 = 10
//hence BitMask = 10
//Synch: Boolean --> True if I want a Synchronous Execution (I cannot close
//my application before the launched process is terminated)
var
zAppName: array[0..512] of Char;
zCurDir: array[0..255] of Char;
WorkDir: string;
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
Closed: Boolean;
begin
Closed := True;
StrPCopy(zAppName, FileName);
GetDir(0, WorkDir);
StrPCopy(zCurDir, WorkDir);
FillChar(StartupInfo, SizeOf(StartupInfo), #0);
StartupInfo.cb := SizeOf(StartupInfo);
StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
StartupInfo.wShowWindow := Visibility;
if not CreateProcess(nil,
zAppName, // pointer to command line string
nil, // pointer to process security attributes
nil, // pointer to thread security attributes
False, // handle inheritance flag
CREATE_NEW_CONSOLE or // creation flags
NORMAL_PRIORITY_CLASS,
nil, //pointer to new environment block
nil, // pointer to current directory name
StartupInfo, // pointer to STARTUPINFO
ProcessInfo) // pointer to PROCESS_INF
then Result := WAIT_FAILED
else
begin
//running the process on the set of CPUs specified by BitMask
SetProcessAffinityMask(ProcessInfo.hProcess, BitMask);
/////
if (Synch = True) then //if I want a Synchronous execution (I cannot close my
// application before this process is terminated)
begin
Closed:= False;
repeat
case WaitForSingleObject(
ProcessInfo.hProcess, 100) of
WAIT_OBJECT_0 : Closed:= True;
WAIT_FAILED : RaiseLastWin32Error;
end;
Application.ProcessMessages;
until (Closed);
GetExitCodeProcess(ProcessInfo.hProcess, Result);
//exit code of the launched process (0 if the process returned no error )
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
end
else
begin
Result := 0;
end;
end;
end; {ExecuteProcess}
// Open Taskmanager, select the launched process, right click,
// "Set affinity", you will see a check on the CPUs you selected
Код, предоставленный вами, - это функция Delphi ExecuteProcess, которая запускает новый процесс с конкретными параметрами, такими как имя исполняемого файла для запуска, настройки видимости (например, скрыть, максимизировать, минимизировать) и настройки синхронизации.
Ответ на ваш вопрос: код использует функцию API SetProcessAffinityMask для указания, какие CPU должен использовать запущенный процесс. Параметр BitMask - это двоичное значение, представляющее собой множество CPU для использования. Каждый бит соответствует CPU (от правого к левому), с 0, означающим неиспользование, и 1, означающим использование.
Например, если вы хотите запустить процесс на CPU 2 и 4, BitMask будет равен 1010 (двоичное). Это означает, что процесс будет использовать только CPU 2 и 4, как указано в двоичной представлении.
Вот разбивка для различных конфигураций CPU:
Запустить на одиночном CPU (например, CPU 0), используйте BitMask = 1.
Запустить на нескольких CPU (например, CPU 2 и 4), используйте BitMask = 1010 (двоичное).
Запустить на всех доступных CPU, используйте BitMask = -1 (все биты установлены).
Обратите внимание, что функция SetProcessAffinityMask работает только на Windows XP и более поздних версиях.
Чтобы продемонстрировать использование этого кода, предположим, у вас есть система с 4 CPU: CPU0, CPU1, CPU2 и CPU3. Вы хотите запустить исполняемый файл на CPU 2 и 4. Вот пример:
varBitMask:DWORD;begin// Установка BitMask для CPU 2 и 4BitMask:=1010;// Запуск процесса с указанным BitMaskExecuteProcess('your_executable.exe',sw_shownormal,BitMask,True);end.
В этом примере функция ExecuteProcess запустит исполняемый файл на CPU 2 и 4. Вы можете проверить это, открыв окно Task Manager, выбрав запущенный процесс, правым кликом мыши и выбрав "Установка приоритета". Диалоговое окно выбора CPU должен отображать галочки для CPU 2 и 4.
Обратите внимание, что функция CreateProcess API имеет другие параметры, которые контролируют создание и запуск нового процесса. Вы можете обратиться к официальной документации Windows для получения дополнительной информации о этих параметрах и их использовании.
Как запустить процесс на конкретном процессоре в много процессорной системе, используя функцию ExecuteProcess и параметры Visibility, BitMask и Synch.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.