TProcess: trouble of kill

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Аватара пользователя
sunjob
постоялец
Сообщения: 180
Зарегистрирован: 12.01.2011 14:19:54

TProcess: trouble of kill

Сообщение sunjob »

TProcess: trouble of kill

день добрый.

исходная идея "проекта" - запуск "процесса", выхлоп приложения в текстовое поле и... желательно в отдельном потоке.
пока как-то не очень удачно :о)

TProcess выполняется в процедуре.
нужно иметь возможность "прекратить работу процесса", в любое время.
сам процесс (как-то работает) но попытка сделать abort не увенчалась, процесс заканчивает "сам по себе".
схемо/код упрощен, но, надеюсь, смысл понятен.

кидайте любые идеи, ссылки, чтив, помидоры, буду разбираться.

исходные
- linux / slaclware 14.2
- fpc 3.2.2
- lazarus 3.8.0 / gtk/qt4/5/

спасибо.

p.s.
наборосал мини-вариант, разбираюсь, проявились еще более непонятные "особенности" работы с "командами/консолью"
как что-то еще нащУпаю - дополню.

Код: Выделить всё


prc : TProcess;

////////////////////////////////////////////////////////////////////////////////
procedure mainform.PrcPrep();
////////////////////////////////////////////////////////////////////////////////
begin                                                   //
prc.Options := prc.Options - [poWaitOnExit];            //
prc.Executable := 'path_to_exe';                        //
prc.Parameters.Add('-arg1');                            //
prc.Parameters.Add('-arg2');                            //
prc.Parameters.Add('-arg3');                            //
end;                                                    //
////////////////////////////////////////////////////////////////////////////////
procedure mainform.PrcExe();
////////////////////////////////////////////////////////////////////////////////
var                                                     //
buff : string  = '';                                    //
cnt  : LongInt = 0;                                     //
i    : integer;                                         //
                                                        //
begin                                                   //
                                                        //
try                                                     //
prc.Execute;                                            //
                                                        //
repeat                                                  //
  try                                                   //
    SetLength(buff, BUF_SIZE);                          //
    cnt := prc.Output.Read(buff[1],Length(buff));       //
    if cnt > 0 then                                     //
      begin                                             //
      SetLength(buff,cnt);                              // не есть гуд
      <работа с буффером buff>                          //
      end                                               //
  finally                                                //
  (...)                                                 //
  end;                                                  //
                                                        //
Application.ProcessMessages;                            //
until cnt = 0;                                          //
                                                        //
except                                                  //
(...)                                                   //
end;                                                    //
                                                        //
prc.Active := false;                                    //
prc.Parameters.Clear;                                   //
end;                                                    //
////////////////////////////////////////////////////////////////////////////////
procedure mainform.PrcKill();
////////////////////////////////////////////////////////////////////////////////
begin                                                   //
//                                                      //
// всевозможные варианты данных команд                  //
//                                                      //
prc.Terminate(0);               // SIGTERM              //
prc.Active := False;            //                      //
fpKill(prc.ProcessID, SIGKILL); // SIGKILL (9)          //
end;                                                    //
////////////////////////////////////////////////////////////////////////////////

PrcPrep(); // вызов из одного  обработчика
PrcExe (); //
...
PrcKill(); // вызов из другого обработчика

////////////////////////////////////////////////////////////////////////////////
Последний раз редактировалось sunjob 13.02.2026 02:37:53, всего редактировалось 4 раза.
Seenkao
энтузиаст
Сообщения: 578
Зарегистрирован: 01.04.2020 02:37:12
Контактная информация:

Сообщение Seenkao »

поставить в очередь на удаление?
Аватара пользователя
sunjob
постоялец
Сообщения: 180
Зарегистрирован: 12.01.2011 14:19:54

Сообщение sunjob »

сначало засомневался, что понимаю совет (или не разбираюсь в теме), задал вопрос ии:
Концепции «поставить в очередь на удаление» у TProcess не существует. Процесс не файл и не объект БД.

Исходя из ваших прошлых сообщений (fpKill не срабатывает, Process.Active := False не помогает), проблема не в синтаксисе, а в том, что сигнал не доходит или PID уже невалиден
а какую концепцию имели в виду вы?
Ответить