none
Como se faz isso, se é que é possível!!! RRS feed

  • Pergunta

  • Caros amigos do Fórum MSDN, eis eu aqui com outra dúvida típica do iniciante.

    Quando num aplicativo qualquer acaba ocorrendo um loop infinito nós recorremos para a famosa Ctrl + Alt + Del.

    Estou tentando desenvolver um aplicativo que num determinado instante ele pode entrar no tal loop infinito, para resolver isso pensei em 2 alternativas.

    Primeira: Teria que criar uma rotina dentro do aplicativo que para mim seria altamente complexa.(por enquanto abdico dessa)

    Segunda: Incluo um simples botão no meu form que faria interromper a execução do aplicativo quando este entrasse num loop infinito.

    Então minha pergunta é: É possível uma rotina que interrompa a execução de outra?

    Se for possível, como podem ser os comandos dessa rotina atrelada ao botão "Parar!!!"? 

    Grato / Durval

    sábado, 25 de março de 2017 21:17

Respostas

  • Para uma rotina ser interrompida em execução, deve existir uma forma de sinalização de forma a que dentro dessa rotina e de forma periódica, de preferência a curtos intervalos de tempo, se possa verificar essa sinalização e consequente abandono da execução.

    Exemplo básico demonstrativo:

    Public Class frmExemplo
    
    
        Private RotinaEmExec As Boolean = False
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'Inicia a execução da rotina ou sinalizar para parar
            If Not RotinaEmExec Then RotinaContinua() Else RotinaEmExec = False
        End Sub
    
        Private Sub RotinaContinua()
            'salvaguarda para não executar duas vezes a rotina
            If RotinaEmExec Then Exit Sub
    
            'assinalr que está em execução
            RotinaEmExec = True
            Button1.Text = "PARAR"
    
            Dim Inicio As Date = Now
    
            'ciclo infinito
            Do
                'Faz qualquer coisa
                'ou simplesmente espera um segundo
                System.Threading.Thread.Sleep(1000)
    
                'liberta o procedimento de outros eventos
                Application.DoEvents()
                'verifica se houve pedido para terminar
                If Not RotinaEmExec Then Exit Do
            Loop
    
            'finalizar
            Dim T As TimeSpan = Now - Inicio
            MsgBox("Rotina esteve em funcionamento: " & T.ToString("T"))
    
            Button1.Text = "INICIAR"
        End Sub
    
    
    End Class
    

     
    • Marcado como Resposta Durval Teixeira domingo, 26 de março de 2017 01:22
    sábado, 25 de março de 2017 22:28

Todas as Respostas

  • Para uma rotina ser interrompida em execução, deve existir uma forma de sinalização de forma a que dentro dessa rotina e de forma periódica, de preferência a curtos intervalos de tempo, se possa verificar essa sinalização e consequente abandono da execução.

    Exemplo básico demonstrativo:

    Public Class frmExemplo
    
    
        Private RotinaEmExec As Boolean = False
    
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'Inicia a execução da rotina ou sinalizar para parar
            If Not RotinaEmExec Then RotinaContinua() Else RotinaEmExec = False
        End Sub
    
        Private Sub RotinaContinua()
            'salvaguarda para não executar duas vezes a rotina
            If RotinaEmExec Then Exit Sub
    
            'assinalr que está em execução
            RotinaEmExec = True
            Button1.Text = "PARAR"
    
            Dim Inicio As Date = Now
    
            'ciclo infinito
            Do
                'Faz qualquer coisa
                'ou simplesmente espera um segundo
                System.Threading.Thread.Sleep(1000)
    
                'liberta o procedimento de outros eventos
                Application.DoEvents()
                'verifica se houve pedido para terminar
                If Not RotinaEmExec Then Exit Do
            Loop
    
            'finalizar
            Dim T As TimeSpan = Now - Inicio
            MsgBox("Rotina esteve em funcionamento: " & T.ToString("T"))
    
            Button1.Text = "INICIAR"
        End Sub
    
    
    End Class
    

     
    • Marcado como Resposta Durval Teixeira domingo, 26 de março de 2017 01:22
    sábado, 25 de março de 2017 22:28
  • Valeu pela reposta Nando, vou tentar adaptar esta sua rotina dentro da que eu estou tentando montar.

    O meu aplicativo sorteia 9 dezenas entre 15 dezenas existentes, mas criei condições do usuário também poder escolher algumas dezenas.

    O fato do aplicativo trabalhar com 9 dezenas entre 15 existentes muitas vezes não impede que o usuário cometa a gafe de escolher mais que nove dezenas e é nessa condição que a rotina entra num loop infinito.

    Pensei numa solução assim:

    Se o usuário escolheu mais que 9 dezenas, então coloco uma mensagem tipo:

    Msg("Você escolheu mais que 9 dezenas!!! Escolha no máximo 9."):Exit Sub

    A princípio parece simples, mas acontece que essas 15 dezenas sempre variam tornado complexo para mim uma rotina que resolveria isso de forma mais clássica. Então a existência de Button com o título "Parar" me parece muito mais simples e resolve em parte. O usuário vai ser orientado caso o aplicativo se mostre aparentemente travado, que na verdade ele entrou no loop, então o usuário deverá apelar para o botão "Parar" ou "Cancelar Rotina"

    Grato / Durval - Curitiba - durvaltnjr@onda.com.br

     

    domingo, 26 de março de 2017 01:42