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)
-   -   Application.ProcessMessages; (https://www.clubdelphi.com/foros/showthread.php?t=53564)

Stevenmn 24-02-2008 01:55:50

Application.ProcessMessages;
 
Buenas necestio saber que hace esto: Application.ProcessMessages;

cual es la funcion de eso ?
Procesar los mensajes, pero como asi....

Ademas necesti saber que hace para tratar de hacer eso mismo en c o c++, si alguien tambien sabe el equivalente de Application.ProcessMessages; de delphi en c o c++ le agradeceria lo posteara.

ArdiIIa 24-02-2008 02:33:47

Te propongo un sencillo ejercicio:

Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
Var I : integer;
begin
I := 0;
while i < 100 Do
Begin
Edit1.Text := IntToStr(I);
inc(i);
sleep(20);
//Application.ProcessMessages;
End;

Prueba a ejecutar ese código con y sin comentar la línea //Application.ProcessMessages;

Trata de mover tu ventana cuando se está ejecutando el código, tanto de un modo u otro.


Como observarás, cuando comentas la línea, tu ventana queda "colapsado" de tal modo que hasta que no finalice el bucle, no hará otra cosa. Sin embargo, si el programa (procesa los mensajes), hace tanto lo que está dentro del bucle como cualquier otra operación requerida por el programa.

Tradicionalmente Windows siempre ha trabajado procesando grandes colas de mensajes. Cada programa windows, envía y recibe en varios mensajes o eventos para realizar cualquier operación. y estos mensajes son los que en este caso hacemos que se actualicen o nó.

En C supongo que el planteamiento es hacer un bucle que controle las operaciones y mensajes que procesa el programa, por ejemplo:

Pinta la ventana
Pregunta si se ha pulsado una tecla
etc....

Las funciones asimilables para este proceso además de un bucle serían

Código Delphi [-]
        TranslateMessage
        DispatchMessage
Mas o menos es como lo entiendo yo...:D

Stevenmn 24-02-2008 15:34:39

Muchas gracias..

jachguate 24-02-2008 19:02:34

Para ir un poco mas abajo....

Windows se comunica con las aplicaciones enviándo "mensajes" a cada una. De esta manera, cuándo ocurre algún movimiento del mouse, o se presiona una tecla en el teclado, windows determina las aplicaciones "interesadas" en dicho suceso (por ejemplo, la que tiene el foco es la que recibe los mensajes del teclado) y le envía un mensaje, por decir algo:
  • se ha presionado la tecla "k"
  • se ha dejado de presionar la tecla "k"
  • se ha movido el ratón a la posición 25, 14
  • se ha presionado el botón derecho del ratón
  • se ha dejado de presionar el botón derecho del ratón
  • debes dibujar nuevamente el área que está en tu ventana principal entre las coordenadas 10,5 y 150,80
  • etc.

Todas las aplicaciones windows deben registrar una rutina que procesará los mensajes, que es básicamente un ciclo que está leyendo contínuamente la cola de mensajes.

Todo esto lo hace la vcl de delphi por nosotros...

Dado que una aplicación delphi se ejecuta por defecto en un solo hilo, la "magia" se pierde cuándo haces un ciclo que demora un poco, o mucho... pues tu aplicación deja de responder a los mensajes del sistema.

Esto no solo tiene el inconveniente de dejar "congelada" la interfaz de usuario, sino que el propio windows detecta que "la aplicación no responde", lo que pone nerviosos a algunos usuarios.

Una llamada a Application.ProcessMessages, como ya te han dicho, alivia esta situación, pero tiene a su vez sus inconvenientes, y vale la pena estar consciente de ellos:

Por ejemplo, si normalmente haces un proceso con un botón, en su evento OnClick, que recorre los registros de una base de datos para realizar cierta operación, al añadir una llamada a ProcessMessages, le dará la oportunidad al usuario de hacer Clic nuevamente en el botón mientras el proceso está ejecutándose, lanzará nuevamente el proceso, y eso no siempre es deseable.

Otra cosa indeseable, por ejemplo, es que el usuario puede cerrar la ventana a medio procesar.

Son cosas que no son ni buenas ni malas por si solas... pero que hay que considerar y que depende de vos y tu habilidad para detectarlas y enfrentarlas el lograr un sistema robusto.

Hasta luego.

;)


La franja horaria es GMT +2. Ahora son las 07:11:13.

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