none
problema com um loop RRS feed

  • Pergunta

  • olá,

    estou tentando iniciar um loop while ao clicar em um botão e fazer ele parar quando eu clico em outro botão, mas quando eu inicio o loop meu sistema para e só vai continuar quando parar o loop, mas para parar o loop eu preciso clicar no botão.Como posso fazer para iniciar o loop e rodar o sistema ao mesmo tempow

    sábado, 21 de outubro de 2017 21:39

Respostas

  • Ola Geisson, esse problema acontece porque você está trabalhando apenas com uma thread em seu programa, assim quando você aciona o loop, a thread fica responsável por esse processo do loop e não enxergará o clique no botão parar até você encerrar o loop e 'libarar' a thread para reconhecer outra ação no seu programa.

    Então a solução é você implementar a ideia de multithreading em seu programa, a baixo fiz um exemplo bem básico que se parece bem com o que você necessita:

    public partial class Form1 : Form
        {
            int cont;
            bool percorrerLoop;
            Thread thread;
    
            public Form1()
            {
                InitializeComponent();             
            }
    
            private void btnIniciar_Click(object sender, EventArgs e)
            {
                cont = 0;
                percorrerLoop = true;
                thread = new Thread(Loop);
                thread.Start();
            }
    
            private void btnParar_Click(object sender, EventArgs e)
            {
                percorrerLoop = false;
                MessageBox.Show(cont.ToString(), "Valor da contagem");
            }
    
            private void Loop()
            {
                while (percorrerLoop)
                {
                    cont++;
    
                    Thread.Sleep(1000);
                }
            }
        } 


    sábado, 21 de outubro de 2017 22:34

Todas as Respostas

  • Ola Geisson, esse problema acontece porque você está trabalhando apenas com uma thread em seu programa, assim quando você aciona o loop, a thread fica responsável por esse processo do loop e não enxergará o clique no botão parar até você encerrar o loop e 'libarar' a thread para reconhecer outra ação no seu programa.

    Então a solução é você implementar a ideia de multithreading em seu programa, a baixo fiz um exemplo bem básico que se parece bem com o que você necessita:

    public partial class Form1 : Form
        {
            int cont;
            bool percorrerLoop;
            Thread thread;
    
            public Form1()
            {
                InitializeComponent();             
            }
    
            private void btnIniciar_Click(object sender, EventArgs e)
            {
                cont = 0;
                percorrerLoop = true;
                thread = new Thread(Loop);
                thread.Start();
            }
    
            private void btnParar_Click(object sender, EventArgs e)
            {
                percorrerLoop = false;
                MessageBox.Show(cont.ToString(), "Valor da contagem");
            }
    
            private void Loop()
            {
                while (percorrerLoop)
                {
                    cont++;
    
                    Thread.Sleep(1000);
                }
            }
        } 


    sábado, 21 de outubro de 2017 22:34
  • Olá amigo,

    O teu problema é de lógica simples.

    Você sabe que o computador lê as instruções linhas por linha, certo?

    Vamos supor que você tem a linha 1, 2, 3, 4, 5, 6, 7,  .... de intrução

    E o loop que você criou está na linha 4.

    Bem o loop faz com que o computador só leia a intrução 4 e ignora todo

    o resto do teu código até que que a condição dentro do loop seja falsa.

    Então, basicamente é isso. O computador "cola" e não permite o click de botão para parar

    porque está ocupado de mais executando o código dentro do loop.

    Mas existe forma de contornar essa situação. Que é a criação de Threads que nada mais é do que

    você dizer ao teu computador que vais executar dois blocos de intruções ao "mesmo" tempo.

    Assim, o loop você coloca dentro de uma Thread e você terá a liberdade de trabalhar com a aplicação

    Mesmo quando o loop estiver a ser executado.

    O amigo ali de cima ilustrou um bom exemplo sobre o caso. Investiga mais a cerca e você verá que é um

    Conceito lindo que a programação nos trás.

    Até mais!

    segunda-feira, 23 de outubro de 2017 05:29
  • Bom dia,

    Era isso o que precisava?

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é 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.

    segunda-feira, 23 de outubro de 2017 13:49
    Moderador
  • Boa tarde,

    Por falta de retorno essa thread está encerrada.

    Se necessário, favor abrir uma nova thread.

    Atenciosamente,

    Filipe B de Castro

    Esse conteúdo é 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.

    segunda-feira, 30 de outubro de 2017 15:42
    Moderador