Página 2 de 3

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 13:35
por fladimir
Marcos, baseado no q eu escrevi e no artigo, estou me referindo a nossos sistemas executando um processo (exemplo gerando 1 relatorio q demora 8min) e consume o processamento de 01 núcleo sendo q temos 8 núcleos, não teria q processar muito mais rápido? tipo 1 min por exemplo

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 14:37
por marcosgambeta
fladimir escreveu:Marcos, baseado no q eu escrevi e no artigo, estou me referindo a nossos sistemas executando um processo (exemplo gerando 1 relatorio q demora 8min) e consume o processamento de 01 núcleo sendo q temos 8 núcleos, não teria q processar muito mais rápido? tipo 1 min por exemplo
Pela lógica, uma aplicação usando uma thread não dividiria seu trabalho em mais de um núcleo. Então, o processamento de um relatório não seria afetado.

E tem a questão do acesso ao disco. Mesmo que a geração do relatório seja agilizada de certa forma, a velocidade ficaria nivelada pela velocidade com que o software lê os dados do HD.

Talvez jogando o processamento do relatório numa thread separada, ocorra alguma melhora no desempenho.

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 15:14
por Jairo Maia
Olá Pessoal,

Apenas continuando dentro desse raciocínio:

Quanto a essa questão, tudo que li até agora quando tive oportunidade, ela existe para permitir uma limitação, não uma ampliação. E sempre também li que a melhor performance é deixar esse gerenciamento por conta do SO.

Mas... aprender é sempre bom.

Outrossim, a internet está vasta de "especialistas" dizendo que é o aplicativo que tem que gerenciar isso, porém, nunca vi nenhuma explicação tecnicamente plausível. Apenas "achometros".

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 15:28
por asimoes
Uma boa ferramenta da MS é o monitor de recursos.
Screen Shot 03-16-17 at 03.27 PM.PNG

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 15:33
por asimoes
Um bom teste pra ver como trabalha a compilação do harbour (fork)

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 15:40
por asimoes
Estou gerando uma compilação do harbour agora, olha só o hbmk2
Vários processos sendo executados e encerrados
Screen Shot 03-16-17 at 03.39 PM.PNG

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 15:59
por asimoes
fiz uma cópia de arquivos com o Fastcopy agora ele criou 9 threads para copiar, super rápido.

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 16:07
por asimoes
Olha só que coisa interessante fazendo um teste de criação de tabela temporária

Código: Selecionar todos

DbCreate("mem:tstMemory", aField, "DBFCDX", .T., "tstMemory")
APPEND FROM ConRec.DBF FOR field->Cancelado == 'S' WHILE Evento() //para não sobrecarregar a aplicação
Observem que o executável demo.exe utilizou 4 threads ?????
Screen Shot 03-16-17 at 04.03 PM.PNG
Screen Shot 03-16-17 at 04.03 PM.PNG (4.37 KiB) Exibido 2799 vezes

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 16:44
por fladimir
Obrigado pelas explicações...

No teu caso Alexandre essa parte final q vc colocou ... While Evento() // para não sobrecarregar a aplicação
Q não entendi muito bem, o q faz Evento() ?

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 18:06
por asimoes
Sabe aquela mensagem a "aplicação não está respondendo" serve para isso, tem situações que o executável trava por conta disso. a função Evento() é para evitar isso e usa hwg_DoEvents() mas pode ser outra que tenha a mesma finalidade.

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 18:30
por fladimir
Em console precisa será?

Usar processamento 8 Nucleos

Enviado: 16 Mar 2017 18:37
por asimoes
Principalmente console, faça o teste

Usar processamento 8 Nucleos

Enviado: 28 Mar 2017 16:59
por janio
aSimoes,

Pode postar a função EVENTO()?

Janio

Usar processamento 8 Nucleos

Enviado: 28 Mar 2017 19:25
por asimoes
Janio,

Segue a função Evento()

Código: Selecionar todos

FUNCTION Evento
   hwg_DoEvents()
RETURN .T.

Usar processamento 8 Nucleos

Enviado: 28 Mar 2017 22:26
por Claudio Soto
DoEvents tiene que ser implementada a nivel de C:

Código: Selecionar todos

//-------------------------------------------------------------------------------------//
HB_FUNC ( DOEVENTS )
//-------------------------------------------------------------------------------------//
{
   MSG Msg;
   HWND hDlgModeless = NULL;
   while( PeekMessage ( &Msg, NULL, 0, 0, PM_REMOVE ) )
   {   
      hDlgModeless = GetActiveWindow();   // this is not better way of take Handle of Modeless Dialog Box

      if ( hDlgModeless == NULL || !IsDialogMessage ( hDlgModeless, &Msg ) )   // ADD June 2015
      {
         TranslateMessage ( &Msg );
         DispatchMessage  ( &Msg );
      }
   }
}
Lo que hace DoEvents es vaciar la cola de mensajes de Windows haciendo que los mismos sean procesados, esto evita que la aplicación se congele. Cuando una aplicación demora más de 5 segundos en procesar sus mensajes Windows muestra el famoso mensaje que la aplicación no responde dando la sensación de que la aplicación se travo. Por eso a nivel de prg a veces dentro de los bucles o de rutinas que demoran mucho hay que colocar DoEvents para evitar esto.