Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Abortar un proceso (https://www.clubdelphi.com/foros/showthread.php?t=44190)

TONIAM 30-05-2007 20:05:27

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

Lepe 30-05-2007 21:08:14

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

TONIAM 30-05-2007 21:17:28

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

roman 30-05-2007 22:13:21

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

seoane 30-05-2007 22:17:54

Aquí deje un ejemplo de como hacer algo similar pero usando threads.

http://www.clubdelphi.com/foros/show...67&postcount=7

TONIAM 31-05-2007 14:30:08

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

dec 31-05-2007 14:36:08

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...

TONIAM 31-05-2007 17:14:37

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

roman 31-05-2007 17:18:35

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

TONIAM 31-05-2007 17:28:23

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

Tonio 31-05-2007 19:26:41

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


La franja horaria es GMT +2. Ahora son las 15:52:57.

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