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: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, 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