Duart3x 0 Posted April 7, 2019 Report Share Posted April 7, 2019 Estou a desenvolver um projeto em c# Windows Form com o Visual Studio e quando estou a adicionar imagens a uma ImageList aparece este erro: System.OutOfMemoryException: 'Memória esgotada.' for (int i = 1; i <= 30; i++) { string imagem; imagem = "ima/" + i +".png"; //MessageBox.Show(imagem); imageList.Images.Add(Image.FromFile(imagem)); Task.Delay(1000); } O que devo fazer para resolver isto? Link to post Share on other sites
M6 150 Posted April 8, 2019 Report Share Posted April 8, 2019 (edited) Aumentas a RAM ou fazes uma gestão mais inteligente da mesma, por exemplo, não carregas as imagens para memória exceto no momento em que as tens mostrar e nessa altura vais descartando e carregando as mesmas conforme necessitas. Edited April 8, 2019 by M6 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to post Share on other sites
Duart3x 0 Posted April 8, 2019 Author Report Share Posted April 8, 2019 6 minutos atrás, M6 disse: Aumentas a RAM ou fazes uma gestão mais inteligente da mesma, por exemplo, não carregas as imagens para memória exceto no momento em que as tens mostrar e nessa altura vais descartando e carregando as mesmas conforme necessitas. Pois, o programa que estou a a fazer é um Quiz... Que tem uma lista de uma classe que eu criei que tem como parâmetros pergunta, 4 respostas para cada Pergunta e o índice da resposta certa. Essa lista tem 30 perguntas! Depois tenho um método para sortear um número que vai ser o índice de uma pergunta na lista que criei. Depois mostro a respectiva pergunta e depois disso elimino da lista essa pergunta que é para não voltar a aparecer aquela pergunta! E eu agora queria que ao lado de cada pergunta aparecesse uma imagem alusivo ao tema da pergunta! E para isso eu tava a tentar usar o mesmo método que fiz para as perguntas! Um número é sorteado, vai buscar a imagem, mostra a imagem e elimina a imagem! As imagens ao total só ocupam 2mb. Já agora como é que eu aumento a memória RAM que o programa pode usar? Link to post Share on other sites
M6 150 Posted April 8, 2019 Report Share Posted April 8, 2019 Presumo que não mostres as perguntas todas ao mesmo tempo. Assim podes guardar apenas a localização das imagens, em vez das imagens em si, e carregas a imagem apenas quando necessitas. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to post Share on other sites
Duart3x 0 Posted April 8, 2019 Author Report Share Posted April 8, 2019 Fiz isso mas mesmo assim dá erro... Criei uma lista de strings para guardar as localizaçoes depois criei esta funçao List<string> UrlList = new List<string>(); public void AddImages() { for (int i = 1; i <= 30; i++) { string imagem; imagem = "ima/" + i +".png"; //MessageBox.Show(imagem); UrlList.Add(imagem); Task.Delay(1000); } } Image DysplayImage; Random numero = new Random(); temp = numero.Next(0, PERGUNTASLISTA.Count); DysplayImage = Image.FromFile(UrlList[temp]); pictureBox1.Image = DysplayImage; Pergunta.Text = PERGUNTASLISTA[temp].pergunta; button1.Text = PERGUNTASLISTA[temp].respostas[0]; button2.Text = PERGUNTASLISTA[temp].respostas[1]; button3.Text = PERGUNTASLISTA[temp].respostas[2]; button4.Text = PERGUNTASLISTA[temp].respostas[3]; Mas mesmo assim dá erro de memoria esgotada! Link to post Share on other sites
M6 150 Posted April 10, 2019 Report Share Posted April 10, 2019 (edited) Quanta RAM tem a máquina? É um Windows de 32 ou 64 bits? Qual a memória que a tua aplicação ocupa em memória? Edited April 10, 2019 by M6 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to post Share on other sites
Duart3x 0 Posted April 10, 2019 Author Report Share Posted April 10, 2019 9 horas atrás, M6 disse: Quanta RAM tem a máquina? É um Windows de 32 ou 64 bits? Qual a memória que a tua aplicação ocupa em memória? Então, a máquina tem 16GB de RAM, processador com 8 núcleos.... 64 bits como é óbvio Ocupa por volta de 20mb Link to post Share on other sites
M6 150 Posted April 15, 2019 Report Share Posted April 15, 2019 On 4/10/2019 at 6:48 PM, Duart3x said: Então, a máquina tem 16GB de RAM, processador com 8 núcleos.... 64 bits como é óbvio Ocupa por volta de 20mb 20Mb parece-me um bocado de mais para o tipo de aplicação que é, mas enfim, já lá vai o tempo em que se fazia magia com 48Kb de RAM 😄 Estás a compilar para 64 ou 32 bits? Em 32 bits existem algumas limitações de RAM, mas mesmo com 20Mb (presumo que seja o somatório dos vários tipos de memória usada pela aplicação) esta-se longe desse limite. Há ai qualquer coisa mal na aplicação, e não estou confiante de que o problema seja das imagens em si, isso pode ser só o ponto que trás ao de cima o problema. Lembro-me de há muitos anos atrás ter um problema semelhante em Delphi, e após longas horas de debug, percebi que o que estava a acontece era simples: faltava desalocar um apontador... Uma situação dessas dificilmente conseguirás ajuda "séria" pelo fórum, apenas podemos discutir hipóteses e dar dicas para procurar o problema. Assim sendo, liga o debug e tenta compreender o que estás a fazer para fazer crescer a memória e o que podes fazer para a ir libertando. Tenta correr o garbage collector manualmente após operações que são mais intensas a nível de memória, em especial após situações onde deixas de necessitar, ou libertas, objetos. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to post Share on other sites
Rui Carlos 367 Posted April 20, 2019 Report Share Posted April 20, 2019 Alguma razão para limitar a memória a 20MB? Não trabalho com C#, mas em Java diria que a JVM sozinha usa mais que 20MB, e os GC não se costumam dar bem com pouco memória livre. Rui Carlos Gonçalves Link to post Share on other sites
M6 150 Posted April 22, 2019 Report Share Posted April 22, 2019 On 4/20/2019 at 4:03 PM, Rui Carlos said: Alguma razão para limitar a memória a 20MB? Não trabalho com C#, mas em Java diria que a JVM sozinha usa mais que 20MB, e os GC não se costumam dar bem com pouco memória livre. Não há limite algum imposto, a aplicação é que está a usar 20Mb. 10 REM Generation 48K! 20 INPUT "URL:", A$ 30 IF A$(1 TO 4) = "HTTP" THEN PRINT "400 Bad Request": GOTO 50 40 PRINT "404 Not Found" 50 PRINT "./M6 @ Portugal a Programar." Link to post Share on other sites
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now