Usuário com melhor resposta
problema com um loop

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
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); } } }
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 30 de outubro de 2017 15:42
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); } } }
- Marcado como Resposta Filipe B CastroModerator segunda-feira, 30 de outubro de 2017 15:42
-
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!
-
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.
-
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.