1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
  2. Anuncie Aqui
    Anuncie aqui você Também: fdantas@4each.com.br

Milissegundos com 6 casas

Discussão em 'Progress 4GL' iniciado por Raviel, Setembro 22, 2010.

  1. Raviel

    Raviel Sem Pontuação

    Pessoal, preciso saber quanto tempo leva para fazer um can-find, estou usando o now, mas preciso que algo mais preciso na base das 6 casas de milissegundos, segue código que eu fiz.

    Código:
    def var vTime as char no-undo.
    assign vTime = string(now).
    
    if not can-find(estrutura where ....) THEN.
    
    MESSAGE "Início: " vTime skip
                   "Final:  " now
        VIEW-AS ALERT-BOX INFO BUTTONS OK.
    
    O que ele me mostra é:
    Início: 22/09/2010 09:55:57,026-03:00
    Final: 22/09/2010 09:55:57,027-03:00

    eu preciso de algo como 09:55:57,026001 <- 6 casas, alguem?
  2. kirchner

    kirchner Membro Participativo Moderador

    Existe duas APIs nervosas do SO que permitem saber o tempo com precisão bem significativa.
    Até em clocks do processador, se precisar.

    Pesquisa por QueryPerformanceFrequency e QueryPerformanceCounter.
  3. eduardo.leite

    eduardo.leite Equipe de Suporte Moderador Equipe de Suporte

    Baseado na solução do nosso amigo acima, coloco abaixo um exemplo do código que pode ser usado:

    Código:
    
    define variable v-datetime-tz   as datetime-tz no-undo.
    define variable i-datetime      as dec         no-undo.
    
    define variable vLongOutMemptr  as memptr      no-undo.
    
    define variable viCyclesStart   as integer     no-undo.
    define variable viCyclesEnd     as integer     no-undo.
    define variable viFrequency     as integer     no-undo.
    define variable viCounter       as integer     no-undo.
    define variable viLoops         as integer     no-undo.
    
    /* define function-call to QueryPerformanceCounter in kernel32.dll */
    procedure QueryPerformanceCounter external "kernel32.dll" persistent:
    
        define output parameter vLongOutMemptr as memptr no-undo.
    
    end.
    
    /* define function-call to QueryPerformanceFrequency in kernel32.dll */
    procedure QueryPerformanceFrequency external "kernel32.dll" persistent:
    
        define output parameter vLongOutMemptr as memptr no-undo.
    
    end.
    
    /* reserve memoryspace of 8 Byte for variable of type LONG */ 
    set-size(vLongOutMemptr) = 8.
    
    /* call external function QueryPerformanceFrequency */
    run QueryPerformanceFrequency (output vLongOutMemptr).
    
    viFrequency = get-long(vLongOutMemptr, 1).
    
    /* start measuring */
    /* a function call lasts about 0.092 ms should be subtracted from result */
    run QueryPerformanceCounter(output vLongOutMemptr).
    
    viCyclesStart = get-long(vLongOutMemptr, 1).
    
    /*** Aqui vc irá colocar seu código do can-find ***/
    
    assign v-datetime-tz = now.
    
    etime(yes).
    
    if can-find(first movto-estoq
                where movto-estoq.it-codigo = "Teste" no-lock) then.
    
    /*** Aqui vc termina de colocar seu código do can-find ***/
    
    /* Stop measuring */
    run QueryPerformanceCounter (output vLongOutMemptr).
    
    viCyclesEnd = get-long(vLongOutMemptr, 1).
    
    assign i-datetime = interval(now, v-datetime-tz, "milliseconds").
    
    message "Numero de Ciclos"  chr(09) ": " (viCyclesEnd - viCyclesStart)                       skip
            "Frequencia"        chr(09) ": " viFrequency                                         skip
            "Tempo [ms]"        chr(09) ": " (viCyclesEnd - viCyclesStart) / viFrequency * 1000  skip(1)
            "Data Time Ini"     chr(09) ": " v-datetime-tz                                       skip
            "Data Time Fin"     chr(09) ": " now                                                 skip
            "Tempo [ms]"        chr(09) ": " i-datetime                                          skip
            view-as alert-box info buttons ok.
    
    /* release memory space */
    set-size(vLongOutMemptr) = 0.
    
    /* release kernel32.dll from memory */
    release external procedure "kernel32.dll". 
    
    
  4. kirchner

    kirchner Membro Participativo Moderador

    A vantagem destas APIs é que a precisão é absurda, se você tiver o hardware correto. Acho que todas as máquinas atuais tem este contador de alta precisão.
    Eu nunca vi esta API falhar.
  5. Raviel

    Raviel Sem Pontuação

    Muito bom eduardo.leite, vc é o cara :ugeek:

    vai ser mesmo muito útil essa API,
    obrigado kirchner e eduardo.leite

    Att,
    Marcos

Compartilhe esta Página