PARAR EXECUCAO DO PROGRAMA
Bom dia!
Estou desenvolvendo um programinha que lista todas as pastas e arquivos de um diretório selecionado, para um cliente com um problema especÃfico que não vem ao caso.
A questão é que quando o diretório selecionado tem muitos arquivos e sub-pastas (+ - 3.000 pastas e sub-pastas e 32.000 arquivos) a busca demora + - 1 minuto para ser concluÃda. Se o cliente selecionar este diretório por engano, terá que aguardar 1 minuto para poder fazer uma nova busca e pior ainda se selecionar um diretório com ainda mais pastas, sub-pastas e arquivos.
E toda vez que o programa está em execução, se damos um clique do mouse, o programa à s vezes pára de responder.
Pensei em colocar um botão [Ô]cancelar[Ô]. Mas primeiro que quando clico no botão enquanto a busca está sendo executada, o programa pára de responder. E segundo, eu não sei como se faz para parar a execução de um algoritmo em loop através de um botão... (como seria?) :D
Pergunto: Tem como fazer um botão que cancele esta busca?
[ ]'s
Estou desenvolvendo um programinha que lista todas as pastas e arquivos de um diretório selecionado, para um cliente com um problema especÃfico que não vem ao caso.
A questão é que quando o diretório selecionado tem muitos arquivos e sub-pastas (+ - 3.000 pastas e sub-pastas e 32.000 arquivos) a busca demora + - 1 minuto para ser concluÃda. Se o cliente selecionar este diretório por engano, terá que aguardar 1 minuto para poder fazer uma nova busca e pior ainda se selecionar um diretório com ainda mais pastas, sub-pastas e arquivos.
E toda vez que o programa está em execução, se damos um clique do mouse, o programa à s vezes pára de responder.
Pensei em colocar um botão [Ô]cancelar[Ô]. Mas primeiro que quando clico no botão enquanto a busca está sendo executada, o programa pára de responder. E segundo, eu não sei como se faz para parar a execução de um algoritmo em loop através de um botão... (como seria?) :D
Pergunto: Tem como fazer um botão que cancele esta busca?
[ ]'s
como seria o seu loop?
Sub ProcuraPasta(xis As String)
Set PastaPai = fso.GetFolder(xis)
Set SubPastas = PastaPai.SubFolders
For Each PastaAtual In SubPastas
lst1.AddItem PastaAtual
[ô]Faz uma nova busca, recursivamente.
ProcuraPasta (PastaAtual.Path)
Next
End sub
Passo inicialmente uma pasta para a função. ex:
ProcuraPasta(c:\)
A recursão faz o resto.
[ ]'s
Altere para:
Inclua um BOTÃO
Sub ProcuraPasta(xis As String)
Set PastaPai = fso.GetFolder(xis)
Set SubPastas = PastaPai.SubFolders
command1.visible=true
lst1.tag = 0
For Each PastaAtual In SubPastas
lst1.AddItem PastaAtual
if lst1.tag = 1 then
msgbox([Ô]Processo Interrompido[Ô])
EXIT FOR
endif
[ô]Faz uma nova busca, recursivamente.
ProcuraPasta (PastaAtual.Path)
Next
command1.visible=false
End sub
Inclua um BOTÃO
PRIVATE SUB COMMAND1_CLICK
lst1.tag = 1
end sub
Caro EDERMIR,
Não funcionou. Continua da mesma forma. Não consigo clicar no botão (nem em qualquer lugar) até que a busca encerre.
Não funcionou. Continua da mesma forma. Não consigo clicar no botão (nem em qualquer lugar) até que a busca encerre.
Dentro da estrutura de repetição, coloca um DoEvents para cada vez que ele passar por essa chamada, vai verficar se existe mais alguma coisa pra fazer antes.
Ai você cria uma flag para sinalizar que tem que sair da rotina e talz.
Ai você cria uma flag para sinalizar que tem que sair da rotina e talz.
Sim, mas o problema é que o programa [Ô]trava[Ô] quando clico em qualquer parte do formulário.
Parece que o programa fica ocupado somente com a busca e qualquer evento que ocorra no formulário fica [Ô]na fila[Ô]. Mas se eu insistir nos cliques, muitas vezes o programa pára de responder.
E a única maneira que o programa pode saber que o usuário quer cancelar a pesquisa é através de um botão.
Como o DoEvents me ajudaria a passar para o programa que o usuário quer cancelar a pesquisa?
[ ]'s
Parece que o programa fica ocupado somente com a busca e qualquer evento que ocorra no formulário fica [Ô]na fila[Ô]. Mas se eu insistir nos cliques, muitas vezes o programa pára de responder.
E a única maneira que o programa pode saber que o usuário quer cancelar a pesquisa é através de um botão.
Como o DoEvents me ajudaria a passar para o programa que o usuário quer cancelar a pesquisa?
[ ]'s
Ola FBUR, o DoEvents serve exatamente para verificar se existe alguma coisa [Ô]mais importante[Ô] a fazer em um código VB (lembrar que VB não é multithread) .
Então, criando uma flag, tipo:
DoEvents [ô]Chamada para que alguma outra coisa aconteça no programa
if (blnUsuarioClicouEmAlgumaCoisa)then [ô]Verifcando se alguma coisa aconteceu
SaiDoLoop[ô]Não me atentei a sua estrutura de repetição, mas seria o comando exit for, exit loop.. sei lá
end if
Então, criando uma flag, tipo:
DoEvents [ô]Chamada para que alguma outra coisa aconteça no programa
if (blnUsuarioClicouEmAlgumaCoisa)then [ô]Verifcando se alguma coisa aconteceu
SaiDoLoop[ô]Não me atentei a sua estrutura de repetição, mas seria o comando exit for, exit loop.. sei lá
end if
Caro RRANGON, foi na mosca. O DoEvents resolveu este problema e muitos outros que eu tinha nos meus programas.
Obrigado à todos!
Obrigado à todos!
Tópico encerrado , respostas não são mais permitidas