Ver Mensaje Individual
  #2  
Antiguo 26-02-2018
Avatar de AgustinOrtu
[AgustinOrtu] AgustinOrtu is offline
Miembro Premium
NULL
 
Registrado: ago 2013
Ubicación: Argentina
Posts: 1.858
Reputación: 15
AgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en brutoAgustinOrtu Es un diamante en bruto
Yo no te recomiendo para nada que uses Application.ProcessMessages. Suelen ocurrir este tipo de cosas "raras". Si lo que realmente queres es mostrar el progreso de actualizacion de algo, no hay otra solucion que una aplicacion multihilo. La Vcl es un framework que corre en un solo hilo (el main-thread). Este es el unico hilo que tiene (o mejor dicho, debe) que encargarse de manipular la interfaz grafica; es decir, practicamente cualquier llamado a metodo, cambiar una propiedad, requiere refrescar los controles, y esto debe ocurrir en el contexto del hilo principal

Asi que la solucion es mover el trabajo "pesado" a otro hilo (proceso en ejecucion) que vaya "informando" periodicamente su progreso al hilo principal, para que este realice las actualizaciones necesarias en la interfaz grafica. De esta manera, la aplicacion se mantiene "respondiendo" mientras esta "trabajando". En pocas palabras, el Application.ProcessMessages es un hack; no realiza el trabajo, no convierte tu aplicacion en multihilo. En el mundo de hoy, no queda otra que utilizar todos los recursos (procesadores) que tienen las computadoras, asi que hay que aprender programacion concurrente y a utilizar hilos.

Cada caso es particular, asi que dependiendo del mismo, y de la version de Delphi que tengas, es mas o menos dificil realizar este trabajo. Por el foro hay ejemplos de uso de hilos (threads). Aca presento una solucion, (que esta lejos de ser optima)

Si queres usar la biblioteca System.Threading (que se conoce como Parallel Programming Library, PPL)

Aca hay ejemplos del CodeRage XI en español:

Parallel Programming Library (PPL) con Delphi

Otro pero en ingles

Hay mas recursos si buscas en la web. Tambien podes optar por la biblioteca OmniThreadLibrary que funciona desde Delphi 2007 en adelante

La web de Neftali tambien tiene ejemplos de threads, incluso utilizando bases de datos
Responder Con Cita