PDA

Ver la Versión Completa : ¿Como evito que el Form principal se "cuelgue" con procesos?


bruykari
27-11-2009, 12:17:54
Hola gente, que tal?
Soy nuevo y no-nuevo aca, siempre veo tutoriales y explicaciones, que me solucionan la vida.
Pero tengo un problema en delphi y no encontre solucion todavia. Busque a mano, busque con el buscador, busque desde google pero no lo encuentro.
Comento mi problema.
En varios programas que utilizan Strings y TStringList, me pasa que cuando un proceso agrega muchas (muchas digamos unas 10000) cadenas, el Form principal se me queda frizado. Se entiende? No tenes control sobre el Form principal, no podes hacerle nada. Ni cerrarlo, es cuelga mal.
Estuve buscando como hacer que esos procedimientos trabajen en segundo plano, pero no encontre especificamente eso.
Espero que se entienda, sino me expreso mejor.
Tambien espero que este en la seccion correcta, porque las otras no me parecian correctas.
Y si esto ya se respondio, por favor denme un link al hilo.
Saludos!

PD: Ya puse un Gif y cuando llamo al proceso que me friza el Form principal, se vuele todo invisible excepto ese gif, pero tambien se me friza el gif.

Caro
27-11-2009, 13:40:53
Hola bruykari, añade esta línea en el ciclo donde estas añadiendo tus 10000 cadenas:


Application.ProcessMessages;


Saluditos

bruykari
27-11-2009, 13:53:43
Exactamente eso estaba necesitando Caro!!!!!
Mil millones de gracias!!!!!!!!
Esto me tiene loco hace 2 horas ya!!!!


Listo!!! Lo que habia preguntado recien, antes de estar editandolo ahora, ya lo solucione yo limpiando el codigo.
De nuevo mil gracias Caro!!!
Saludos!!!!!!!!!!!!

PD: MODs, el tema termino, cierrenlo si quieren.

pepe2000
24-02-2010, 16:22:04
Buenas,
Que solución tan simple y elegante, pero quisiera saber si esto funciona igual que un hilo de ejecución (Tthread), y si se puede colocar un control para "cortar" el bucle.
Felicidades.

Ñuño Martínez
24-02-2010, 16:32:08
No, no tiene nada que ver con los hilos (TThread). Es más, creo que no es buena idea llamar a "Application.ProcessMessages" desde un hilo que no sea el principal. Desconozco si el objeto Application es "de hilo seguro" (creo recordar que con Delphi 6 no lo hera, no sé si ahora sí lo es).

En el caso de múltiples hilos las soluciones han de venir por otro lado. Por ejemplo, que todas las actualizaciones de formularios y ventanas se hagan desde el hilo principal y que en los hilos "hijo" sólo se haga procesamiento de datos.

rgstuamigo
24-02-2010, 16:39:45
Buenas,
Que solución tan simple y elegante, pero quisiera saber si esto funciona igual que un hilo de ejecución (Tthread), y si se puede colocar un control para "cortar" el bucle.
Felicidades.
La instruccion "Application.ProcessMessages;" lo que hace es interrumpir la ejecución de la aplicación para procesar los mensajes de la cola de Windows (http://www.winprog.org/tutorial/es/message_loop.html) y permitir que los controles se repinten. Para más información ver la ayuda de Delphi, presionado la tecla F1.;).
Sobre el asunto del Hilo(Thread) creo que deberías ser mas específico y detallista de lo que pretendes hacer, en todo caso si el tema es diferente a éste, pues te aconsejo que hábras un nuevo tema(nuevo hilo) y posties ahí tus dudas, ésto para tener un buen orden y fascilitar las búsqueda por temas.;).
Saludos...:)