Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-05-2006
rex rex is offline
Miembro
 
Registrado: dic 2003
Posts: 81
Poder: 21
rex Va por buen camino
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??
Responder Con Cita
  #2  
Antiguo 29-05-2006
Avatar de Enan0
Enan0 Enan0 is offline
Miembro
 
Registrado: may 2004
Ubicación: Argentina
Posts: 565
Poder: 20
Enan0 Va por buen camino
Hola mira para terminar la aplicacion Usa Halt(0) creo que 0 es el valor mas alto
Responder Con Cita
  #3  
Antiguo 29-05-2006
rex rex is offline
Miembro
 
Registrado: dic 2003
Posts: 81
Poder: 21
rex Va por buen camino
Amigo te debo una, muchisimas gracias
Responder Con Cita
  #4  
Antiguo 29-05-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
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 ).

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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #5  
Antiguo 29-05-2006
zurech zurech is offline
Miembro
 
Registrado: jul 2005
Posts: 61
Poder: 19
zurech Va por buen camino
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
__________________
noticiasfrikis, mi web de chorradas
Responder Con Cita
  #6  
Antiguo 30-05-2006
rex rex is offline
Miembro
 
Registrado: dic 2003
Posts: 81
Poder: 21
rex Va por buen camino
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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Terminar y liberar Thread eureka API de Windows 1 19-09-2005 14:03:39
Terminar Thread coulthard Internet 3 28-11-2004 22:05:08
Esperar a terminar algo Patxi Varios 2 10-07-2004 11:02:11
Mi aplicacion no puede terminar King Varios 0 08-06-2004 09:24:48
Forzar a terminar a una aplicacion diegofhernando Varios 1 12-08-2003 00:47:40


La franja horaria es GMT +2. Ahora son las 23:05:35.


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
Copyright 1996-2007 Club Delphi