Página 1 de 1

Liberar processador em esperas

Enviado: 14 Dez 2015 12:16
por rmlazzari
Amigos, retornando ao Clipper, agora como hobby, verifiquei que o programa que estou fazendo para jogar Sudoku, quando em espera por inkey() ou achoice() toma todo o processador apenas para si. Ou seja, nessas esperas, examinando o Gerenciador de Tarefa, o processador fica ocupado 100%, pelo menos no Windows XP. Pesquisei e encontrei a seguinte solução: no inicio do programa principal, logo após as declarações de LOCAL e STATIC se existirem, acrescente a seguinte instrução:

ft_onidle({||ft_iamidle()})

Necessita das libs NANFOR e CPMI. Mas atenção, não a NANFOR.LIB original. Na NANFOR.LIB original há essa função mas que não funciona bem com os "filhos" do Windows NT 4 (2000, XP, talvez o 7). Para esses SOs, é preciso substituir uma de suas funções, a FT_IAmIdle().
O .OBJ dessa função está no pacote e substituí-la na NANFOR.LIB é bem fácil, com o utilitário LIB.EXE que vem com o VB5, da MS.

Histórico e instruções sobre esse recurso estão em http://www.engwall.com/clipper/nfpat1a.htm

O resultado é que os estados de espera agora usam 0% do processamento.


Em tempo: Antes de postar, dei uma verificada e não encontrei tópico sobre esse assunto. Mas como ando meio "enferrujado", pode ser que já exista, sim, e que eu esteja chovendo no molhado. Se for o caso, peço desculpas e que desconsiderem esses tópico.

Liberar processador em esperas

Enviado: 16 Dez 2015 20:14
por JoséQuintas
Existem posts sobre isso.
Coincidiu que conheci direto a OSLIB, resolveu, então nunca testei nenhuma outra opção.
Não sei dizer se é melhor ou pior, apenas sei que funciona.

No início do aplicativo, pra ativar o controle automático:

Código: Selecionar todos

OL_Yield(.T.)
E depois, se quiser ajuste mais detalhado, só acrescentar chamadas aonde sabe que pode liberar toda CPU:

Código: Selecionar todos

nKey := 0
DO WHILE nKey != K_ESC
   nKey := Inkey()
   OL_Yield()
ENDDO