CreateProcess с параметрами приоритета? - PullRequest
5 голосов
/ 30 января 2012

Как я могу создать и запустить процесс из моей программы с возможностью установки приоритета процесса?

Это то, что у меня есть:

const
  LOW_PRIORITY            = IDLE_PRIORITY_CLASS;
  //BELOW_NORMAL_PRIORITY = ???
  NORMAL_PRIORITY         = NORMAL_PRIORITY_CLASS;
  //ABOVE_NORMAL_PRIROTY  = ???
  HIGH_PRIORITY           = HIGH_PRIORITY_CLASS;
  REALTIME_PRIORITY       = REALTIME_PRIORITY_CLASS;

procedure RunProcess(FileName: string; Priority: Integer);
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  Done: Boolean;
begin
  FillChar(StartInfo,SizeOf(TStartupInfo),#0);
  FillChar(ProcInfo,SizeOf(TProcessInformation),#0);
  StartInfo.cb := SizeOf(TStartupInfo);
  try
    Done := CreateProcess(nil, PChar(FileName), nil, nil,False,
                          CREATE_NEW_PROCESS_GROUP + Priority,
                          nil, nil, StartInfo, ProcInfo);
    if not Done then
      MessageDlg('Could not run ' + FileName, mtError, [mbOk], 0);
  finally
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;
end;

Вышекод работает в том, что я могу установить приоритет выполняемого процесса.Но посмотрите на изображение ниже диспетчера задач Windows:

Screenshot of Task Manager

Вы можете установить дополнительные параметры, такие как «Ниже нормы» и «Выше нормы», которые я также хочу установить.Просматривая Windows.pas, я не вижу такого значения.

Как я могу создать и запустить свой процесс с этими дополнительными параметрами?

Спасибо:)

Ответы [ 2 ]

5 голосов
/ 30 января 2012

Эти два флага не объявлены в Windows.pas, поставляемом с Delphi. Вы должны будете объявить эти значения для себя. Значения можно найти в документации MSDN SetPriorityClass .

const
  BELOW_NORMAL_PRIORITY_CLASS = $00004000
  ABOVE_NORMAL_PRIORITY_CLASS = $00008000

Кроме того, помните, что CreateProcess изменяет свой второй параметр, lpCommandLine, параметр, которому вы передаете PChar(FileName). Таким образом, ваш код потерпит неудачу, если вы вызовете функцию, передающую строковый литерал, который находится в постоянной памяти. Я бы добавил следующую строку

UniqueString(FileName);

непосредственно перед вызовом CreateProcess. Более подробную информацию можно найти здесь: Нарушение прав доступа в функции CreateProcess в Delphi 2009

0 голосов
/ 30 января 2012
IDLE_PRIORITY_CLASS
BELOW_NORMAL_PRIORITY_CLASS
NORMAL_PRIORITY_CLASS
ABOVE_NORMAL_PRIORITY_CLASS
HIGH_PRIORITY_CLASS
REALTIME_PRIORITY_CLASS

Ссылка

...