Jump to content
mutleey

Aliviar uso da CPU

Recommended Posts

Pessoal existe alguma maneira de aliviar o uso da CPU usando qualquer parâmetro abaixo de 10 milissegundos?

Eu gostaria de usar um sleep(5)  ou sleep(3) por exemplo, mas sei que sleep() não é possível porque o uso de 1 a 9 será automaticamente padronizado para 10 milissegundos.

Alguem sugere alguma alternativa?

O que acontece é que estou fazendo uma automação que requer uma precisão porque usa como entrada um receptor infravermelho, a leitura é muito rápida e se eu usar um "loop" de verificação com um tempo de 10 ms que é o mínimo do sleep() as vezes (raro) a rotina perde a leitura de entrada, vou dar um exemplo  ..

 

While True
    ; verificação de entrada... perfeito 0% de erro, mas o uso da CPU atinge 50%
WEnd

While True
    ; verificação de entrada... 0% de uso da CPU, mas 10% de chance de dar erro
    Sleep(10)
WEnd

Obs: tentei  UDF _HighPrecisionSleep() porem o tempo "pelo menos aqui" continua entre 10 e 15 ms.

 

Qualquer dica será de grande ajuda..

Share this post


Link to post
Share on other sites

Use "Select ou Switch" Independente de onde o loop estiver, eles serão chamados na próxima volta caso algo neles seja executado durante o loop, dessa forma você pode colocar até um sleep de sei lá 10 segundos no loop, se vc executar alguma função contida nele e o loop já estiver passado pelo Switch ou select ele será executada na próxima volta independente de onde o loop estiver.

"a rotina perde a leitura de entrada" Nunca será perdida

while true

Select
      case _Ispressed("Tecla Exemplo1")
        _FunçãoQualquer1()
      case _Ispressed("Tecla Exemplo2")
        _FunçãoQualquer2()
EndSelect

sleep(10000) <---Se o loop estiver parado aqui esperando os 10 segundos e você apertar uma das teclas de exemplo, na proxima volta a função da tecla será executada. Dessa forma vc não vai precisar esperar que o loop passe por um "if" e a precisão será 100%.
wend

 

Edited by Pedro Pinheiro

Share this post


Link to post
Share on other sites

Pedro sua sujestão é bacana mas como citei no primeiro post a rotinha não espera por "keys" ou "switchs" desta forma ficaria facil pois ao apertar uma tecla toda a estrutura da função seria chamada e assim não haveria erro, o que acontece é que dentro da rotina tem uma verificação de sensores ópticos, e estes sensores são mega rápidos na leitura, então estes 10 ms de "pausa" no looping que seria para aliviar o uso da cpu... (raro) mais tem chance de erro, acredito que a "leitura" destes sensores é muito menor que 10 ms, se eu uso a rotina sem a "pausa", sleep() ou GUIGetMsg() a precisão fica 101% o unico problema é que o uso da cpu vai a 50% e com uma pausa de 10 ms na rotina o uso da cpu é 0%.

Edited by mutleey

Share this post


Link to post
Share on other sites

@Pedro Pinheiro quando o loop está parado no sleep ele não executa nenhuma outra função então se está esperando o sleep de 10 milisegundos terminar e apertar alguma tecla vai falhar sim pois não esta passando pelo "Select ou Switch" naquele momento!

#include <Misc.au3>

Local $hDLL = DllOpen("user32.dll")

$contar = 0
While 1
    Select
        Case _IsPressed("41", $hDLL)
            $contar += 1
            ExitLoop
    EndSelect
    Sleep(10000); <---Se o loop estiver parado aqui não vai executar o Select
WEnd

MsgBox(4096, '', $contar)

 

Share this post


Link to post
Share on other sites

Depois de muita procura e testes, achei uma modificação da UDF _HighPrecisionSleep() que retornou resultados satisfatorios..

Pra quem estiver com o mesmo problema segue o código.

; mutleey

HotKeySet("{ESC}", "__Exit")


Global $ntdll = DllOpen("ntdll.dll")
Global $winmm = DllOpen("winmm.dll")


While True
    $timer = TimerInit()
    MsSleep(1)
    ConsoleWrite('> ' & TimerDiff($timer) & @LF)
WEnd

Func MsSleep($MS)
    $MS *= 1000
    DllCall("winmm.dll", "int", "timeBeginPeriod", "int", "1")
    DllCall("ntdll.dll", "dword", "NtDelayExecution", "int", 0, "int64*", -10 * $MS)
EndFunc   ;==>MsSleep


Func __Exit()
    DllClose("ntdll.dll")
    DllClose("winmm.dll")
    Exit
EndFunc

 

  • Like 2

Share this post


Link to post
Share on other sites

@mutleey vou guardar aqui e com certeza será de grande utilidade principalmente para funções de crédito!

  • Thanks 1

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×