FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
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 |
#2
|
||||
|
||||
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. |
#3
|
|||
|
|||
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 |
#4
|
||||
|
||||
Suponiendo que tu bucle es algo como
lo que propone Lepe es que lo modifiques así:
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:
// Saludos |
#5
|
||||
|
||||
Aquí deje un ejemplo de como hacer algo similar pero usando threads.
http://www.clubdelphi.com/foros/show...67&postcount=7 |
#6
|
|||
|
|||
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 |
#7
|
||||
|
||||
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í:
También puedes probar:
O dejarlo como Román decía al principio, pero:
O, por otro lado,... tal vez utilizar algún "Hilo" aparte en tu aplicación para leer el archivo de marras... |
#8
|
|||
|
|||
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 |
#9
|
||||
|
||||
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 |
#10
|
|||
|
|||
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 |
#11
|
|||
|
|||
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 |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
EXCEPTION con parametros u otro comando para abortar | fcios | Firebird e Interbase | 10 | 31-03-2007 09:39:16 |
¿como abortar ejecución de eventos? | pjjorda | Varios | 5 | 06-06-2006 21:59:59 |
Como Abortar mi APP sin q aparescan Mens de ERROR | pcicom | OOP | 5 | 22-03-2005 10:22:13 |
Abortar un Ciclo While | jmedina | Varios | 2 | 08-03-2005 21:48:17 |
abortar inmediatamente | acrophet | Varios | 4 | 20-10-2003 19:07:18 |
|