none
Problemas com crescimento do consumo de Memória com Windows forms C# usando Timer RRS feed

  • Pergunta

  • Amigos

    Estou desenvolvendo uma aplicação desktop que exibe imagens, textos e músicas. Todo o programa trabalha sozinho, a partir da configuração do usuário. Para isso, criei um timer principal no Form1 que a cada ciclo de 1 segundo incrementa uma variável inteira cont. A cada valor dessa variável, uma tarefa é executada e, ao final de tudo, a variável é resetada e o ciclo recomeça. Tudo está funcionando perfeitamente, o problema é que, a cada ciclo, o consumo de memória exibido no visual stúdio vai aumentando, indo desde uns 23Mb até quase 80, quando o programa congela! Coloquei um label exibindo o progresso da variável e a contagem pára! O.o

    No início pensei que pudessem ser as músicas, então desabilitei, depois desabilitei textos, etc. A aplicação tem 3 timers, deixei só o principal timer trabalhando e no final de 16 minutos congelou! Notem que o programa funciona perfeitamente por 16 minutos e para! Gostaria de saber se o timer, trabalhando em loop infinito, pode gerar algum lixo, sei lá. Lembro que a coisa parece ter melhorado ao usar o comando Refresh() ao final da aplicação das imagens nos picturebox e labels, mas ainda assim o problema persiste... Alguém sabe de algum problema já relatado sobre isso?

    Desde já agradeço a atenção.

    terça-feira, 8 de março de 2016 18:55

Respostas

  • Não precisa mandar o código inteiro, somente o trecho que vc abre o arquivo. Como vc ta fazendo isso?

    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985

    • Marcado como Resposta Marcos SJ sexta-feira, 11 de março de 2016 19:44
    quarta-feira, 9 de março de 2016 16:52

Todas as Respostas

  • Uma observação: li esse tópico aqui, que fala do aumento de memória devido ao uso de classes estáticas:https://social.msdn.microsoft.com/Forums/pt-BR/3452a7e9-a0f6-4f8b-80ac-a3998c6c60fa/consumo-de-memria?forum=webgeralpt

    Parece que a classe estática gera um "lixo". No meu programa existe uma única classe estática, chamada Util, que armazena algumas variáveis simples e 3 arrays de booleanos. Nesses arrays, eu coloco o mesmo número das imagens (50) e cada vez que uma dessas imagens é escolhida aleatoriamente, os valores referentes mudam de false pra true, de modo que, se essa mesma imagem for escolhida novamente, será desconsiderada, porque o valor estará como true, e outra terá que ser escolhida, de modo que nunca ocorre uma repetição até que todas sejam exibidas. Noto que os picos acontecem a cada mudança, ou seja, quando as classes que fazem as escolhas são obrigadas a consultar a classe e alterar seus valores. Será que isso pode causar tanto problema??? 

    terça-feira, 8 de março de 2016 19:09
  • O timer em si não tem problema... Acredito que vc esteja alocando diversas vezes um objeto que nunca está sendo limpo de memória, famosos memory leaks... Esses são os piores problemas para identificar, eu geralmente entro em modo debug e fico rodando o código passo a passo e vendo o TaskManager pra ver onde a memória está subindo. 

    Identificando os pontos verifique se tem algum objeto que falta dar um dispose (acontece muito com objetos de conexão com o banco de dados e leitura/gravação de arquivos).


    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985


    terça-feira, 8 de março de 2016 19:14
  • Se puder postar como vc está manipulando esses arquivos (musica, texto e imagens) posso verificar se tem algum memory leak.

    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985

    terça-feira, 8 de março de 2016 19:17
  • Se puder postar como vc está manipulando esses arquivos (musica, texto e imagens) posso verificar se tem algum memory leak.

    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985

    Obrigado pela resposta, André. O Código já está meio extenso e eu fiz uma implementação pra trabalhar com arquivos .mp3, não nativos do C#, que trabalha com wave. Basicamente, no form1, que é o principal, roda o timer em loop infinito que incrementa uma variável que, a cada valor, dispara um método. As classes de escolha de musica, textos e imagens escolhem aleatoriamente números inteiros, que eu uso para compor o nome do arquivo. Exemplo: todas as músicas tem o mesmo nome Mu1, Mu2, Mu3. Após a escolha, eu junto o "Mu" + o valor inteiro escolhido + ".mp3". O problema é que, esses números de músicas, imagens e textos, precisam ficar armazenados em arrays para consulta e tudo que eu tenho que "memorizar" fica na classe Util, que é toda composta de Atributos Estáticos (nenhum método), exceto os arrays de booleanos.

    O que eu noto é que, a cada vez que uma classe de escolha é chamada, acontece um pico de memória. Cada vez que surge uma nova imagem ou um novo texto, dá-se o pico, mas quando não há mudança, nada acontece. Após a leitura do tópico sobre instancias de estáticos, percebi que, todas as escolhas precisam instanciar a classe util. Meu problema agora é que eu quero fazer esse teste, mas o nível da solução requer um conhecimento muito superior ao meu e eu teria que mudar toda a forma de acessar a classe util.

    A outra saída seria armazenar as informações de útil em um banco de dados ou arquivo txt externo...

    Estou estudando aqui o que fazer...


    quarta-feira, 9 de março de 2016 16:16
  • Não precisa mandar o código inteiro, somente o trecho que vc abre o arquivo. Como vc ta fazendo isso?

    Att. Andre de Mattos Ferraz - www.iamferraz.com.br - http://mbsy.co/ldecrespigny/19022985

    • Marcado como Resposta Marcos SJ sexta-feira, 11 de março de 2016 19:44
    quarta-feira, 9 de março de 2016 16:52
  • Boa tarde,

    Por falta de retorno do usuário, esta thread será encerrada.

    Caso seja necessário, por gentileza, abra uma nova thread.

    Atenciosamente

    Marcos SJ

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as postagens que resolveram o seu problema. Essa é uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    sexta-feira, 11 de março de 2016 19:44