Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   API de Windows (https://www.clubdelphi.com/foros/forumdisplay.php?f=7)
-   -   Problema con Application.ProcessMessages (https://www.clubdelphi.com/foros/showthread.php?t=92862)

strelok 26-02-2018 18:24:31

Problema con Application.ProcessMessages
 
Hola a todos,

esa hermosa línea está haciendo que mi última semana con delphi sea una pesadilla, resulta que hay un formulario que tiene una barra de progreso y un grid, el código luego de setear el mínimo, máximo y posición, hace un
Código:

Application.ProcessMessages
, una vez ejecutado ese código los colores de la barra y del gris vuelvan a ser los que tiene por defecto.

Explicado mas detalladamente, tengo una barra de progreso (TAdvSmoothProgressBar) y un grid (TDBAdvGrid), éste último tiene un evento GetCellColor, en el cuál pinto las filas pares e impares, de gris claro y oscuro respectivamente, luego de ejecutada la línea antes mencionado, lo que se ha pintado en el GetCellColor se pierde, vuelve a ser todo por defecto. Ayudaaa:confused:

AgustinOrtu 26-02-2018 19:07:27

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


La franja horaria es GMT +2. Ahora son las 20:35:24.

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