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?
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.
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".
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.
Muito bom eduardo.leite, vc é o cara :ugeek: vai ser mesmo muito útil essa API, obrigado kirchner e eduardo.leite Att, Marcos