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 30-05-2007
TONIAM TONIAM is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 38
Poder: 0
TONIAM Va por buen camino
Abortar un proceso

Hola foro, tengo una ventana modal, la cual cuando se crea en el evento del formulario FormActivate empieza un proceso de lectura de un fichero realizando varias cosas, a la ventana le puesto un boton de cancel, pero por mucho que le pulso no hace nada hasta que acaba el proceso, hay o conoceis alguna manera de cuando pulse el boton de cancelar, finalize el proceso aunque no haya terminado y cierre la ventana.

Muchas gracias y un saludo a todos
Responder Con Cita
  #2  
Antiguo 30-05-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino
Si la lectura es un bucle, puedes poner una bandera (variable booleana) para cancelar la carga, dentro del bucle debes poner un Application.ProcessMessages.

En caso de que la carga se realice mediante un XX.LoadFromFile ... poco podrás hacer (de momento no se me ocurre nada).

Cuanta más información aportes, mejor.

Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #3  
Antiguo 30-05-2007
TONIAM TONIAM is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 38
Poder: 0
TONIAM Va por buen camino
Gracias por tu aportacion, te especifico un poco mas, es como tu dices es un bucle while de lectura de un fichero y mi intencion es desde un boton del dialog poder cancelar el bucle y cerrar la ventana, puedes especificarme un poco mas como puedo poner lo de la bandera que me dices y lo de la Application.ProcessMessages. Gracias por tu respuesta, otra cosa que no te comentado el formulario ya tiene un boton de cancelar, pero aunque lo aprete no hace nada, ni siquiera deja apretarlo hasta que acabe el proceso.

Gracias
Responder Con Cita
  #4  
Antiguo 30-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Suponiendo que tu bucle es algo como

Código Delphi [-]
while condiciones do
begin
  operaciones;
end;

lo que propone Lepe es que lo modifiques así:

Código Delphi [-]
Cancelado := false;

while condiciones and not Cancelado do
begin
  Application.ProcessMessages;

  operaciones;
end;

Application.ProcessMessages permite que tu formulario procese los mensajes en cada vuelta del ciclo, de manera que puedas orpimir el botón de Cancelar. En el evento OnClick de ese botón pondrías:

Código Delphi [-]
Cancelado := true;

// Saludos
Responder Con Cita
  #5  
Antiguo 30-05-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Aquí deje un ejemplo de como hacer algo similar pero usando threads.

http://www.clubdelphi.com/foros/show...67&postcount=7
Responder Con Cita
  #6  
Antiguo 31-05-2007
TONIAM TONIAM is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 38
Poder: 0
TONIAM Va por buen camino
Gracias a todos, he solucionado el problema de la manera que me comento roman y Lepe lo unico que he detectado que no se muestra como se apreta el boton, pulsas y al cabo de unos segundos se cierra, pero no vez el efecto de pulsar el boton y tampoco es automatico, no se si me explico.

Nuevamente gracias a todos
Responder Con Cita
  #7  
Antiguo 31-05-2007
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

¿Pusiste un "Application.ProcessMessages"? Tiene toda la pinta de que no, pero, si lo pusiste y aún así encuentras el problema que describes... la verdad, no sé si se ganaría algo cambiando un poco las cosas tal que así:

Código Delphi [-]
Cancelado := false;

while condiciones do
begin
  Application.ProcessMessages;

  if Cancelado then 
    Break;

  operaciones;
end;

También puedes probar:

Código Delphi [-]
Cancelado := false;

while condiciones do
begin
  if Cancelado then 
    Break;

  operaciones;

  Application.ProcessMessages;
end;

O dejarlo como Román decía al principio, pero:

Código Delphi [-]
Cancelado := false;

while condiciones and not Cancelado do
begin
  operaciones;

  Application.ProcessMessages;
end;

O, por otro lado,... tal vez utilizar algún "Hilo" aparte en tu aplicación para leer el archivo de marras...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 31-05-2007
TONIAM TONIAM is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 38
Poder: 0
TONIAM Va por buen camino
Gracias Dec por las variantes, si que me acorde de poner lo de Application.ProcessMessages y he probado hacer lo que me dices, el resultado es mas o menos igual, pero yo creo que es por la cantidad de operaciones que hace antes de dar la vuelta al bucle, por eso el intervalo de tiempo, desde que lee uno hasta que lee otro y vuelve a pasar por Application.ProcessMessages actualiza unos ficheros, crea una plantilla personalizada, envia un PDF personalizado por Email, etc. Realmente no es que no funcione lo unico es que se queda como si no hubieras pulsado nada hasta que vuelve al bucle y pasa por el ProcessMessages, al menos que haya algo que se pueda poner al propio formulario para que detenga el proceso mientras todavia no haya dado la vuelta.

Un saludo
Responder Con Cita
  #9  
Antiguo 31-05-2007
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Digamos que el uso de ProcessMessages es algo así como la versión pobre de un thread. Si- como describes -tu ciclo es muy pesado, definitivamente te conviene usar la opción que te comenta seoane. Que no te asuste lo de threads, si revisas el ejemplo de seoane verás que es muy sencillo.

// Saludos
Responder Con Cita
  #10  
Antiguo 31-05-2007
TONIAM TONIAM is offline
Miembro
 
Registrado: may 2003
Ubicación: Valencia
Posts: 38
Poder: 0
TONIAM Va por buen camino
lo probare Roman, a veces lo desconocido nos para un poco, pero como comentas lo mismo no es tan complicado seguire tu consejo y mirare lo de los hilos.

Gracias
Responder Con Cita
  #11  
Antiguo 31-05-2007
Tonio Tonio is offline
Miembro
 
Registrado: may 2003
Ubicación: Logroño
Posts: 111
Poder: 22
Tonio Va por buen camino
No se si te servirá, para bucles si funciona.

Ejemplo en un procedure:

procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
for i:=0 to 9999999 do
begin
{Haces la tarea repetitiva}
Label1.Caption:=IntToStr(i);
{....}

{Procesamos los mensajes de windows}
Application.ProcessMessages;
{Si tecla ESC pulsada, paramos el bucle}
if GetKeyState(VK_Escape) and 128 =128 then break;
end;
end;

Sacado de Trucomania.
Espero te sirva.
Un saludo.
Tonio
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
EXCEPTION con parametros u otro comando para abortar fcios Firebird e Interbase 10 31-03-2007 08:39:16
¿como abortar ejecución de eventos? pjjorda Varios 5 06-06-2006 20:59:59
Como Abortar mi APP sin q aparescan Mens de ERROR pcicom OOP 5 22-03-2005 09:22:13
Abortar un Ciclo While jmedina Varios 2 08-03-2005 20:48:17
abortar inmediatamente acrophet Varios 4 20-10-2003 18:07:18


La franja horaria es GMT +2. Ahora son las 17:11:53.


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