tprogress y windows vista

User avatar
José Luis Sánchez
Posts: 484
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España
Contact:

tprogress y windows vista

Post by José Luis Sánchez »

Hola,
tengo una función de reindexar que usa la clase tprogress para mostrar el avance por pantalla. Algo asi,

Code: Select all


   Db_OpenNoIndex( "Libros", "LI" )
   oMeter:setRange( 0, LI->(LastRec()) )
   pack
   nMeter := 0
   index on upper(LiCodigo);
         tag CODIGO;
         for ! deleted();
         eval( oMeter:SetPos( nMeter++ ), oMeter:Refresh(), .t. );
         every 1

El caso es que en XP va perfecto, pero en Windows Vista el meter no arranca, como que se queda parado. ¿ Alguna idea ?

Saludos,
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Jose Luis,

Revisa samples\ProgTime.prg, aqui funciona bien en Vista.

Prueba a aumentarle el incremento:
oMeter:SetPos( nMeter += 5 )
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
José Luis Sánchez
Posts: 484
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España
Contact:

Post by José Luis Sánchez »

Antonio,
la unica manera de hacerlo funcionar ha sido metiendole un inkey para que vaya más despacito la cosa. Algo así:

Code: Select all

   index on upper(LiCodigo);
         tag CODIGO;
         for ! deleted();
         eval ( inkey(0.01), oMeter:SetPos( nMeter+=5 ), oMeter:Refresh(), .t. );
         every 5
Ahora lo que me pasa es que el meter no llega hasta el final, se queda como en la mitad, y eso que cuando termina oMeter:nPos vale lo mismo que oMeter:nMax.

Saludos,
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

José Luis,

Has probado a usar SysRefresh() en vez de Inkey() ? Es más aconsejable
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
José Luis Sánchez
Posts: 484
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España
Contact:

Post by José Luis Sánchez »

Si, antes lo tenía con sysrefresh pero no iba bien. Acabo de volverlo a probar y sin inkey no hay tutia. ¿ Cual es la cantidad menor de tiempo que le puedo poner a un inkey ?
Sobre lo de que el meter llegue a la mitad, al estar en un dialogo... ¿ el valor de oMeter:nMax tiene que ser la mitad que si estuviera en una ventana ? Lo digo por el lio de las coordenadas en dialogos que son la mitad y todo eso.

Saludos,
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

No tendría porque ser la mitad. Cosas de Windows :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
José Luis Sánchez
Posts: 484
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España
Contact:

Post by José Luis Sánchez »

Lo que no entiendo es que pase con Vista, porque con XP iba de coña.

Saludos,
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Cuando haces oMeter:setRange( 0, LI->(LastRec()) ) el meter ya tiene un handle de control válido ? Es decir, tendrías que hacerlo desde la claúsula ON INIT del diálogo.

Existen algunas diferencias entre XP y Vista. Son pocas, pero las hay.
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
José Luis Sánchez
Posts: 484
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España
Contact:

Post by José Luis Sánchez »

Antonio,
yo defino el meter en una función, de esta manera:

Code: Select all

   DEFINE DIALOG oDlg OF oApp():oWndMain RESOURCE "UT_INDEXAR" TITLE oApp():cAppName
   oDlg:oFont:= oApp():oFont

      REDEFINE BITMAP oBmp ID 111 OF oDlg RESOURCE "BB_INDEX" TRANSPARENT

      REDEFINE SAY aSay[01] ID  99 OF oDlg PROMPT i18n( "Generando índices..." )
      REDEFINE SAY aSay[02] ID 100 OF oDlg PROMPT ""

      oMeter := TProgress():Redefine( 101, oDlg )

   oDlg:bStart := { || SysRefresh(), Ut_CrearCdx( aSay[02], oMeter, lMsg ), oDlg:End() }

   ACTIVATE DIALOG oDlg ;
      ON INIT DlgCenter(oDlg,oApp():oWndMain)
y en Ut_CrearCdx está el código del reindexado. Asi es como lo he hecho siempre y ha funcionado en 95, 98, Me y XP. Dime que hago para que vaya en Vista, y siga funcionando en XP.

Gracias,
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Jose Luis,

El rango del meter, lo defines en Ut_CrearCdx() ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
José Luis Sánchez
Posts: 484
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España
Contact:

Post by José Luis Sánchez »

Antonio,
el rango del meter lo defino en Ut_CrearCdx y varía para cada dbf que indexo. Cada vez que abro un dbf modifico el rango del meter. Esto me ha funcionado siempre bien.

Saludos,
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Jose Luis,

Revisa samples\ProgTime.prg
regards, saludos

Antonio Linares
www.fivetechsoft.com
fleal
Posts: 234
Joined: Tue Oct 25, 2005 12:39 am
Location: México, DF

ok

Post by fleal »

Jose Luis,

yo uso una pc con vista home basic para desarrollar y he notado que el meter con Progress no llega al 100% o no arranca como tu dices...
¿Puede ser por que el PC es muy rápido?.
Duo core, 1 Giga en Ram.

La verdad no le he dado más importancia... pero lo que si me ha gustado es que antes usaba el METER y al cambiarme a Progress he notado una super velocidad al momento de indexar.
De 1:08 minutos a 8 segundos es un tiempo super rápido al indexar las mismas dbfs.

Saludos
Fernando
México DF
User avatar
José Luis Sánchez
Posts: 484
Joined: Thu Oct 13, 2005 9:23 am
Location: Novelda - Alicante - España
Contact:

Post by José Luis Sánchez »

Yo creo que la cosa va por ahi, o que la clausula every no se evalua bien en un PC rápido. Si al every le pones un WaitSeconds a la clausula every el meter se actualiza, pero no llega al final. He probado también a modificar el valor del meter con oMeter:DeltaPos y hace lo mismo que con SetPos.

Yo tengo un iMac Core2 duo a 2GHz y 2MB de RAM. El bicho vuela, pero los meter no despegan. Algo pasa, pero no se que. El ejemplo de Antonio si que funciona, pero ahi el intervalo de movimiento es mayor. Tampoco se si en versiones recientes de FWH la clase meter se ha modifcado, yo tengo una de hace más de un año, y me ha ido siempre bien hasta ahora. Con XP iba divinamente.

Saludos,
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Jose Luis,

Yo lo estoy usando en un Core Quad y funciona bien. Por lo que no creo que sea cuestion de velocidad, sino tal vez de tiempo de refresco para Windows, de ahí que el WaitSeconds() ayude.

Estas usando Vista en modo nativo ó desde vmware/Parallels ?
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply