COMO INTERROMPER LOOP COM TECLA OU BOTÃO CANCELAR

 Tópico anterior Próximo tópico Novo tópico

COMO INTERROMPER LOOP COM TECLA OU BOTÃO CANCELAR

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#490472 - 19/09/2019 09:15:45

PAULORGAR
CERQSP
Cadast. em:Março/2014


Última edição em 19/09/2019 09:29:32 por PAULORGAR

Bom dia.

Tenho um loop em VB.NET, e gostaria de interromper acionando uma tecla ou,  no Form,  clicando em um botão Cancelar.
Tentei com multithread e BackgroundWorker, mas não consegui sucesso.
Alguém poderia me ajudar ?




Resposta escolhida #490474 - 19/09/2019 09:36:21

MARCELOKROL
REBOUCAS
Cadast. em:Julho/2004


não sei se é a melhor forma, mas no form uma vez eu fiz assim:
Criei uma variável boolean para todo o formulário com o nome de cancelar e atribui o valor como false. Ai a cada loop eu verificava se o valor dela era true, e se fosse saia da rotina. Dentro do evento click do botão coloquei: cancelar = true

Como disse: não sei se essa é a melhor forma de fazer, mas uma vez que precisei, fiz desse modo




#490475 - 19/09/2019 09:42:01

PAULORGAR
CERQSP
Cadast. em:Março/2014


Citação:
:
não sei se é a melhor forma, mas no form uma vez eu fiz assim:
Criei uma variável boolean para todo o formulário com o nome de cancelar e atribui o valor como false. Ai a cada loop eu verificava se o valor dela era true, e se fosse saia da rotina. Dentro do evento click do botão coloquei: cancelar = true

Como disse: não sei se essa é a melhor forma de fazer, mas uma vez que precisei, fiz desse modo


Ok, Marcelo, grato pelo retorno.
Fiz assim também, porém quando o loop inicia, o botão cancelar, fica sem acesso, pois o foco está no loop.
Somente após a finalização do loop, que libera o form para poder clicar no botão cancelar.



#490478 - 19/09/2019 11:15:20

PAULORGAR
CERQSP
Cadast. em:Março/2014


Consegui resolver.  Servirá de ajuda a quem precisar.

O que estava faltando era Application.DoEvents() dentro do loop.
Então ficou assim:

Public Class Form1
                Private InterromperProcesso As Boolean    '(criar esta variável)

Do While ....
        'faz os procedimentos que necessita dentro do loop
         If InterromperProcesso = True Then
                        Exit Do
        End If
        Application.DoEvents()    'justamente esta instrução que estava faltando
Loop


Clicando no btnParar, atribui "True" ao InterromperProcesso, fazendo com que o Loop acima seja interrompido.

    Private Sub btnParar_Click(sender As Object, e As EventArgs) Handles btnParar.Click
        InterromperProcesso = True
    End Sub





#490479 - 19/09/2019 11:21:41

MARCELOKROL
REBOUCAS
Cadast. em:Julho/2004


a sim esqueci de falar, tem que ter o DoEvents
Caso não queria que ele seja executado a cada loop, e se esse processo contiver milhares de loops, pode fazer assim:
dim i as long
i = 0
Do While ....
    i = i +1
        'faz os procedimentos que necessita dentro do loop
         If InterromperProcesso = True Then
                        Exit Do
        End If
       if (i mod 10 = 0) then     Application.DoEvents()    'executa o doevents a cada 10 loops
Loop




#490480 - 19/09/2019 11:29:59

PAULORGAR
CERQSP
Cadast. em:Março/2014


Citação:
:
a sim esqueci de falar, tem que ter o DoEvents
Caso não queria que ele seja executado a cada loop, e se esse processo contiver milhares de loops, pode fazer assim:
dim i as long
i = 0
Do While ....
    i = i +1
        'faz os procedimentos que necessita dentro do loop
         If InterromperProcesso = True Then
                        Exit Do
        End If
       if (i mod 10 = 0) then     Application.DoEvents()    'executa o doevents a cada 10 loops
Loop


Legal.
Vou finalizar o tópico.
Grato.



 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por PAULORGAR em 19/09/2019 11:31:38