PARAR EXECUCAO DO PROGRAMA

FBUR 12/11/2009 09:27:52
#327494
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
MKING 12/11/2009 10:44:41
#327506
como seria o seu loop?
FBUR 12/11/2009 10:58:15
#327509

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
EDERMIR 12/11/2009 12:37:51
#327525
Altere para:
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
FBUR 13/11/2009 09:19:52
#327609
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.
RRANGON 13/11/2009 09:25:02
#327610
Resposta escolhida
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.
FBUR 13/11/2009 09:45:38
#327611
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
RRANGON 13/11/2009 11:13:21
#327628
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
FBUR 13/11/2009 11:45:54
#327640
Caro RRANGON, foi na mosca. O DoEvents resolveu este problema e muitos outros que eu tinha nos meus programas.

Obrigado à todos!
Tópico encerrado , respostas não são mais permitidas