Usuário com melhor resposta
Como se faz isso, se é que é possível!!!

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
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
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
-
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