Wulfgar 0 Denunciar post Postado Maio 26, 2009 Olá pessoal, Já trabalho com C# e ASP.NET faz um tempo mais este é o primeiro programa funcional que eu estou criando utilizando o Windows form, e estou encontrando o seguinte problema: tenho um programa que cria back-up de alguns arquivos e deleta, copia e reescreve alguns arquivos, isso demora um certo tempo dependendo da quantidade de arquivos a serem manipulados. Durante o processo de manipulação dos arquivos quero exibir um gif de loading e alterar o text de um label informando o os passos que o sistema esta executando. O código do evento ficou assim: private void btnAtualizar_Click(object sender, EventArgs e) { pictureBox1.Show(); lblProgressoInfo.Text = "Transferindo arquivos."; // inserindo em um List<string> denominado "nomes" os dados vindos de um CheckListBox int numeroItems = CLBCentropys.Items.Count; List<string> nomes = new List<string>(); for (int i = 0; i < numeroItems; i++ ) { if (CLBCentropys.GetItemChecked(i)) { nomes.Add(CLBCentropys.GetItemText(CLBCentropys.Items[i])); } } // Classe que manipula os arquivos. Centropy centropy = new Centropy(); centropy.Atualizar(nomes,lblProgressoInfo); pictureBox1.Hide(); lblProgressoInfo.Text = "Transferencia de arquivos concluida."; } O problema é que durante o processo o texto do label não muda e o pictureBox não aparece, enquanto o evento não termina. Agradeço desde já. Compartilhar este post Link para o post Compartilhar em outros sites
Oenning 0 Denunciar post Postado Maio 27, 2009 Você usa o Application.DoEvents(); para atualizar a tela. Geralmente é colocado logo após você mudar o text do label. Compartilhar este post Link para o post Compartilhar em outros sites
Wulfgar 0 Denunciar post Postado Maio 27, 2009 Você usa o Application.DoEvents(); para atualizar a tela. Geralmente é colocado logo após você mudar o text do label. Eu testei o metodo label.update() e pictureBox.Update(), e o update do label funcionou certinho, mais a imagem que é um gif, não fica animada, ela para no primeiro passo do gif, acredito que por ter um metodo rodando ao mesmo tempo, então mudei a estratégia. Coloquei um timer na pagina e fui alterando a imagem de acordo com os tickes que o timer gera, porem do mesmo jeito a imagem não altera, e utilizando o application.DoEvent() ele até da star no timer e gera um tick, o problema é que no tempo que o metdo fica rodando deveriam acontecer muito outros eventos tick que mudaria a imagem do pictureBox. Eu não conheço o funcionamento de threads mais será que nesse caso elas funcionariam ? Compartilhar este post Link para o post Compartilhar em outros sites
Oenning 0 Denunciar post Postado Maio 28, 2009 Se você jogar um gif animado em um picture box, sem fazer nenhum tipo de processamento. Ele fica animado? Threads para alterar controles não funcionam. Compartilhar este post Link para o post Compartilhar em outros sites
Wulfgar 0 Denunciar post Postado Maio 28, 2009 Se você jogar um gif animado em um picture box, sem fazer nenhum tipo de processamento. Ele fica animado? Threads para alterar controles não funcionam. Sim, seu eu simplismente deixar o gif no pictureBox ele fica animado, mais enquanto o programa esta processando ele para de alternar as imagens. E esse é o problema, queria exibir esta imagen pra dar um feedback pro usuario que o sistma não travou. Inicialmente eu estava utilizando uma progressBar para fazer isso, porem o metodo que roda manipulando os arquivos executa varios processos, logo não faz muito sentido deixar uma progressBar que fica enchedo e esvaziando sem exibir um progresso do processo por completo. Compartilhar este post Link para o post Compartilhar em outros sites
Wulfgar 0 Denunciar post Postado Maio 28, 2009 http://forum.imasters.com.br/public/style_emoticons/default/yay.gif Consegui !!!!! Dividi o gif animado em varias imagens. Adcionei todas estas imagens em um Resource. Criei um atributo que é um array de objetos Image. Durante a construção da classe atribui uma imagem a cada posição do array. Class classe{ private int imageIndex; private Image[] imagens = new Image[10]; classe(){ imageIndex = 0; imagens[0] = Resource1.barra01; imagens[1] = Resource1.barra02; // assim até imagens[10] .... } } Depois disso eu passo o pictureBox como parametro para o metodo que executa as operações, e cada vez que este metodo transfere um arquivo eu altero a umagem do gif na sequencia certa. private atualizar(String diretorioOrigem, String diretorioDestino,PictureBox pictureBox1){ DirectoryInfo diretoryInfo = new DirectoryInfo(diretorioOrigem); DirectoryInfo diretoryInfoDestino = new DirectoryInfo(diretorioDestino); DirectoryInfo[] arrayDiretorios = new DirectoryInfo[1]; FileInfo[] arrayArquivos = new FileInfo[1]; if (diretoryInfo.Exists) { arrayDiretorios = diretoryInfo.GetDirectories(); arrayArquivos = diretoryInfo.GetFiles(); foreach (FileInfo arquivo in arrayArquivos) { File.Copy(arquivo.FullName, diretorioDestino + "\\" + arquivo.Name); ///// Atualizando o gif. ///////////// if (imageIndex <= 8) { imageIndex++; } else { imageIndex = 0; } pictureBox1.Image = imagens[imageIndex]; pictureBox1.Update(); ////////////////////////////////// } } } Muitíssimo obrigado Oenning. Se num fosse você eu estaria até agora tentando entender os threads pra descobrir que num funciona pra isso. XD Compartilhar este post Link para o post Compartilhar em outros sites