Esses dias estava precisando montar algo para apresentar o tempo que uma determinada rotina, uma parte eu pesquisei e consegui um função pronta, outra parte foi montada. Compartilhando abaixo a idéia.
/*/{Protheus.doc} TempRest
Exemplo de chamada da função.
** Fonte não compilado, pode haver erros de sintaxe.
/*/
User Function APrefHR()
Local nTimeIni := Seconds()
Local nI := 1
Local nFim = 50000
For Ni := 1 To nFIm
conout(U_TempRest(nI, nFim,nTimeIni)[4])
Next
Return Nil
/*/{Protheus.doc} TempRest
Faz o calculo de tempo restante para um processo
@author TSC679 - CHARLES REITZ
@since 12/07/2016
@param nTotaisP, numeric, descricao
@param nIncrement, numeric, descricao
@param nTimeIni, numeric, descricao
@return return, return_description
/*/
User Function TempRest(nTotaisP,nIncrement,nTimeIni)
Local cTempoRest := ""
Local nHoraRest := 0
LOcal nSecAtual := seconds()
Local aRetFun := {nil,nil,nil,nil}
Local nSecAux := 0
If KillApp()
MsgInfo("Sistema será finalizado.","Atenção - "+ProcName())
KillApp(.T.)
EndIf
//retorna o tempo restante em horas
//nHoraRest := noROund(((nTotaisP/nIncrement*(nSecAtual-nTimeIni))/60)/60,2)
nSecAux := Round(((nSecAtual-nTimeIni)/nIncrement)*(nTotaisP-nIncrement),2)
nHoraRest := Round((nSecAux/60)/60,2)
aRetFun[1] := U_zVal2Hor(nHoraRest,":")
//retorna a previsão final da hora
nHoraFinal := ROund(((nSecAux+nSecAtual)/60)/60,2)
aRetFun[2] := U_zVal2Hor(nHoraFinal,":")
aRetFun[3] := ROund((100*nIncrement)/nTotaisP,2)
aRetFun[4] := cValToChar(nIncrement)+"/"+cValToChar(nTotaisP)+" - "+cValToChar(aRetFun[3])+"% | Prev.Rest.:"+aRetFun[1]+" - Prev.Final:"+aRetFun[2]
Return aRetFun
/*/{Protheus.doc} zVal2Hora
Converte valor numérico (ex.: 15.30) para hora (ex.: 15:30)
Fonte: https://terminaldeinformacao.com/2015/05/14/converter-valor-numerico-para-hora-em-advpl/
@author Atilio
@since 20/09/2014
@version 1.0
@param [nValor], Numérico, Valor numérico correspondente as horas
@param [cSepar], Caracter, Caracter de separação (ex.: 'h', ':', etc)
@return cHora, Variável que irá armazenar as horas
@example
u_zVal2Hora(1.50, 'h') //01h30
u_zVal2Hora(1.50, ':') //01:30
/*/
User Function zVal2Hor(nValor, cSepar)
Local cHora := ""
Local cMinutos := ""
Default cSepar := ":"
Default nValor := -1
cHora := Alltrim(Transform(nValor, "@E 99.99"))
//Se o tamanho da hora for menor que 5, adiciona zeros a esquerda
If Len(cHora) < 5
cHora := Replicate('0', 5-Len(cHora)) + cHora
EndIf
//Fazendo tratamento para minutos
cMinutos := SubStr(cHora, At(',', cHora)+1, 2)
cMinutos := StrZero((Val(cMinutos)*60)/100, 2)
//Atualiza a hora com os novos minutos
cHora := SubStr(cHora, 1, At(',', cHora))+cMinutos
//Atualizando o separador
cHora := StrTran(cHora, ',', cSepar)
Return cHora