Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   rutina OUT32 se ejecuta siempre primero (https://www.clubdelphi.com/foros/showthread.php?t=73344)

glrjola 15-04-2011 18:15:38

rutina OUT32 se ejecuta siempre primero
 
Hola ... soy muy nuevo en esto del Delphi asi que tenganme paciencia...

probando manejar el puerto Paralelo arme unas rutinas para sacar algunos datos por LPT1 (peep3) y a su vez me grafique algunas cosas en pantalla (LuzRojaOn).

pero ponga donde ponga le rutina PEEP3 , siempre la ejecuta antes que la rutina del grafico en pantalla y queda feo... como fuera de sincronismo...
Código Delphi [-]
 
procedure Tprincipal.peep3;
begin
  Out32($37A,6);       // direccion de LPT1 Bocina on
  sleep(500);
  Out32($37A,14);       // direccion de LPT1 Bocina off
  sleep(500);
  Out32($37A,6);       // direccion de LPT1 Bocina on
  sleep(500);
  Out32($37A,14);       // direccion de LPT1 Bocina off
  sleep(500);
  Out32($37A,6);       // direccion de LPT1 Bocina on
  sleep(1000);
  Out32($37A,14);       // direccion de LPT1 Bocina off
end;
 
Procedure TPrincipal.LuzRojaOn;
begin
    AdvShape1.Appearance.Color:= clWhite;
    AdvShape1.Appearance.ColorTo:=clGray;
    AdvShape2.Appearance.Color:= clWhite;
    AdvShape2.Appearance.ColorTo:=clGray;
    AdvShape3.Appearance.Color:=$00D5D5FF;
    AdvShape3.Appearance.ColorTo:=$000000D9;
    Out32($378,4);       // direccion de LPT1
End

Puede ser que Delphi7 le asigne una prioridad mas alta o algo asi ???

no se como explicarme mejor... muchas gracias....

glrjola 15-04-2011 18:28:09

agrego...

por ejemplo el la funcion LuzRojaOn se ejecuta la sentencia OUT32 antes que todos los cambios de colores.......

duilioisola 15-04-2011 22:37:42

Supongo que deberás poner algo para que refresque la parte gráfica antes de ejecutar Out32:

Código Delphi [-]
Procedure TPrincipal.LuzRojaOn;
begin
  AdvShape1.Appearance.Color:= clWhite;
  AdvShape1.Appearance.ColorTo:=clGray;
  AdvShape2.Appearance.Color:= clWhite;
  AdvShape2.Appearance.ColorTo:=clGray;
  AdvShape3.Appearance.Color:=$00D5D5FF;
  AdvShape3.Appearance.ColorTo:=$000000D9;
  Application.ProcessMessages; // Procesa los mensajes pendientes del sistema
  Out32($378,4); // direccion de LPT1
End

Para ahorrar tiempo en procesos que "no son los importantes" Delphi los deja para "después".
En este caso es el redibujado del formulario.
Para forzar esto, se suele utilizar Application.ProcessMessages, que ejecuta todos los mensajes pendientes antes de seguir con la ejecución del programa (redibijado, eventos de teclado, eventos de raton, etc.).

Si no quieres que el programa procese todos los eventos (puede ser lento si estás dentro de un bucle grande) puedes tratar de enviar la instruccion Repaint o Refresh.
Código Delphi [-]
  ...
  AdvShape1.Refresh;
  AdvShape2.Refresh;
  AdvShape3.Refresh;
  Out32($378,4); // direccion de LPT1
End
o
Código Delphi [-]
  ...
  AdvShape1.Repaint;
  AdvShape2.Repaint;
  AdvShape3.Repaint;
  Out32($378,4); // direccion de LPT1
End

PD. Cuando escribas código ponlo entre tags [ delphi] ... [/ delphi]

glrjola 16-04-2011 00:20:45

Solucionado con el "Application.ProcessMessages;"

Muchas Graciassss !!!


La franja horaria es GMT +2. Ahora son las 06:24:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi