Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Отсортировать выполнение процессов в системе

Delphi , Программа и Интерфейс , Процессы и Сервисы

Отсортировать выполнение процессов в системе

Автор: Евгений Левшаков
WEB сайт: mcsa.ru

Нужно отсортировать выполнение процессов в системе, т.е. поочередно выполнить несколько процессов, тем самым автоматизировать некоторый " трудовой процесс" ? Этот код предоставляет такую возможность. Вы создаете " кадр" существующих в системе процессов, находите в нем нужный вам процесс по его ID и обрабатываете его сообщение.


unit PIDProcessing;

interface

function PIDExists(PID:Integer):boolean;
function RunProgram(ExeProgram:String):integer;
 
implementation
 
uses TLHelp32, Windows;
 
function PIDExists(PID:Integer):boolean; 
    {возвращает true, если процесс найден}
var hSnap:Cardinal;  
    // Snapshot (" кадр" ) запущенных процессов в системе
    ProcessEntry:TProcessEntry32; 
    // информация о процессе
    Finding:LongBool; 
    // возвращает true, 
       если первый  процесс скопирован в буфер, 
       иначе false
    Found:Boolean; 
    // возвращает true, 
       если в системе есть запущенные процессы
 begin
 hSnap:=CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS,0);  

         {создаем " кадр"  запущенных процессов}

  if hSnap=0 then
    begin
    Result:=False;
    Exit;
    end;
  Found:=False;
  ProcessEntry.dwSize:=SizeOf(ProcessEntry); 
  Finding:=Process32First(hSnap,ProcessEntry); 

       {предоставляет информацию  
        о первом процессе в " кадре" }

  While Finding do
    begin
    if PID=ProcessEntry.th32ProcessID then Found:=True;  

       {если необходимый процесс найден, 
       возвращаем true}

    Finding:=Process32Next(hSnap,ProcessEntry);  
 
       {предоставляет информацию 
        о следующем процессе в " кадре" }

    end;
  CloseHandle(hSnap);
  Result:=Found;
end;

function RunProgram(EXEProgram:String):Boolean;   

       {Возвращает true, 
        если процесс системы выполнен}

var si:TStartupInfo;   

       {определение свойств главного окна, 
        создаваемого приложения}

    pi:TProcessInformation; 

       {информация о созданном процессе 
        и его главном потоке}
begin
  FillMemory(@si,sizeof(si),0);
  si.cb:=Sizeof(si);
  Result:=False;
  if EXEProgram< > '' then
   if CreateProcess(nil,PChar(EXEProgram),
    nil,nil,false,
        NORMAL_PRIORITY_CLASS,nil,nil,si,pi) then  

    {создаем процесс}

     begin
 
     {до тех пор пока процесс существует в " кадре"  
      обрабатываем его сообщение}

     While PIDExists(pi.dwProcessId) 
            do Application.ProcessMessages;

     CloseHandle(pi.hProcess);  

     {закрываем процесс}

     CloseHandle(pi.hThread);  

     {останавливаем поток, 
      порожденный процессом}

          Result:=True;
        end;
end;

end.

Переведенный текст:

Код, который вы предоставили, написан на языке программирования Delphi и предназначен для сортировки выполнения процессов в системе. Цель - автоматизация некоторых шагов "процесса работы".

Вот что код делает:

  1. Он создает снимок всех запущенных процессов в системе с помощью функции CreateToolHelp32Snapshot из единицы TLHelp32.
  2. Затем он итерирует этот снимок и проверяет, если существует процесс с заданным ID (PID).
  3. Если он находит желаемый процесс, он устанавливает флаг Found в True.
  4. Функция RunProgram используется для запуска нового программы (или процесса) путем предоставления ее исполняемого имени как строки.
  5. Он создает новый процесс с помощью функции CreateProcess и ожидает, пока он не будет выполнен.

Код можно улучшить в нескольких способах:

  1. Обработка ошибок: Код не обрабатывает ошибки должным образом. Например, если CreateToolHelp32Snapshot fails, он просто возвращает код ошибки без предоставления какой-либо информации о том, что пошло не так.
  2. Организация кода: Код quite long и может быть организован в отдельные процедуры или функции для улучшения его читаемости.
  3. Выполнение: Код итерирует все процессы в системе для каждого вызова PIDExists, что может быть неэффективно, если есть много запущенных процессов.

Вот пример, как можно улучшить код:

function GetProcessInfo(pid: Integer): TProcessEntry32;
begin
  Result := GetProcessEntry(0, pid);
end;

function RunProgram(exeProgram: String): Boolean;
var
  si: TStartupInfo;
  pi: TProcessInformation;
begin
  FillMemory(@si, SizeOf(si), 0);
  si.cb := SizeOf(si);

  if CreateProcess(nil, PChar(exeProgram), nil, nil, false,
    NORMAL_PRIORITY_CLASS, nil, nil, si, pi) then
  begin
    Result := True;

    while GetProcessInfo(pi.dwProcessId) do
      Application.ProcessMessages;

    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
  end;
end;

В этом примере я извлек логику получения информации о процессе в отдельную функцию GetProcessInfo, что делает код более читаемым и поддерживаемым. Я также улучшил обработку ошибок, проверяя возвращаемое значение CreateProcess и предоставляя значимый сообщение об ошибке, если оно fails.

Отсортировать выполнение процессов в системе - это возможность автоматизации некоторых трудовых процессов, создавая 'кадр' существующих процессов и обрабатывая сообщения выбранного процесса по его ID.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Процессы и Сервисы ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 14:33:07/0.0036990642547607/0