Liberar processador em esperas

Aqui você poderá oferecer suas Contribuições, Dicas e Tutoriais (Texto ou Vídeo) que sejam de interesse de todos.

Moderador: Moderadores

rmlazzari
Usuário Nível 2
Usuário Nível 2
Mensagens: 64
Registrado em: 09 Dez 2013 14:18
Localização: são paulo

Liberar processador em esperas

Mensagem 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.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20415
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP
Curtiram: 1 vez

Liberar processador em esperas

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, multithread, gtwvg, fivewin 25.12, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui), (hmg3), (hmg extended), (oohg), PNotepad, ASP, (Linux/Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder