Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Terminar la ejecucion (https://www.clubdelphi.com/foros/showthread.php?t=32174)

rex 28-05-2006 23:31:32

Terminar la ejecucion
 
Hola a todos, alguien me puede decir una manera de cerrar mi aplicaion algo asi como fuerza bruta, ya que estoy haciendo un proceso y si quiero terminar con mi apliacion exe con application.terminate se queda trabada, la vuelvo a ejecutar y me da errores, lo unico que funiciona es cuando la ejecuto desde delphi con run--Program Reset. Quiero cerrarla y que haga esta funcion como si le diera program reset y se cierre este haciendo lo que este haciendo

es posible??

Enan0 29-05-2006 03:13:13

Hola mira para terminar la aplicacion Usa Halt(0) creo que 0 es el valor mas alto

rex 29-05-2006 07:18:21

Amigo te debo una, muchisimas gracias

Lepe 29-05-2006 08:45:49

Pero ten en cuenta los efectos colaterales:

- La memoria del PC se queda ocupada.
- Windows puede necesitar un reiniciado, por la inestabilidad provocada.
- Otros recursos que queden sin liberar y en próximas ejecuciones dará error en lugares donde antes no los daba.
- Cliente insatisfecho al ver tantos errores.

Y todo esto... cada vez que se ejecuta tu programa. En estos foros nunca abogamos por este tipo de soluciones "sucias", si optas por ellas quizás deberías pasarte a Visual Basic (On error goto Next :eek:).

Este tipo de fallos no son de código, sino de conceptos, tienes que pasar al siguiente nivel y aprender por qué ocurren para poder subsanarlos.

Son errores frustrantes, e incluso pueden llevar semanas solucionarlos, pero una vez hecho, serás mejor programador... tú decides ;)

Saludos

zurech 29-05-2006 10:51:50

Te voy a dar otra alternativa que no tiene tantos inconvenientes para el pobre Windows.
La utilicé hace tiempo, aunque después consegui solucionar el problema y ya no la utilizo.

Lo que hace este procedimiento es directamente matar al proceso de tu programa.
Código Delphi [-]
{
Esta funcion, como su bonito nombre indica sirve para obtener solo el nombre del EXE, en lugar de la ruta completa
}
function TFrmPrincipal.soloExe(archivo : String) : String;
var
  resultado : String;
  i : integer;
begin
  for i:=1 to Length(archivo) do
    begin
      if (archivo[i] = '\') then
        resultado := ''
      else resultado := resultado + archivo[i];
    end;

  result := resultado;
end;

{
Funcion que mata el proceso de la aplicacion, y sus procesitos (hijos)
}
function TFrmPrincipal.KillTask(FileName:String):integer;
 var
     ContinueLoop:BOOL;
     FSnapshotHandle:THandle;
     FProcessEntry32:TProcessEntry32;
 const
     PROCESS_TERMINATE=$0001;
 begin
     FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
     FProcessEntry32.dwSize:=Sizeof(FProcessEntry32);
     ContinueLoop:=Process32First(FSnapshotHandle,FProcessEntry32);
     while integer(ContinueLoop)<>0 do
     begin
         if
 ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile))=UpperCase(FileName))
             or (UpperCase(FProcessEntry32.szExeFile)=UpperCase(FileName)))
 then

 Result:=Integer(TerminateProcess(OpenProcess(PROCESS_TERMINATE,BOOL(0),

                                     FProcessEntry32.th32ProcessID),0));
           ContinueLoop:=Process32Next(FSnapshotHandle,FProcessEntry32);
     end;
     CloseHandle(FSnapshotHandle);
end;

procedure TFrmPrincipal.Terminar();
begin
  try
    KillTask (soloExe(Application.ExeName));
  except on exception do end;
end;

Tienes más información sobre un problema parecido en este hilo

rex 30-05-2006 03:55:09

Muchas gracias amigos, estuve probando con halt(0) y parece ser que no hubo errores al reiniciar mi aplicación, pero por supuesto que esta alternativa como la plantean no me convence, definitivamente es correcto liberar los recursos que se queden ocupados al utilizar este tipo de trucos, asi que voy a implementar el codigo que amablemente me has proporcionado zurech y te comento como me fue.

Muchas gracias a todos por su comentarios y ayuda. Les agradezco su atención.


La franja horaria es GMT +2. Ahora son las 16:52:59.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi