USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Dicas

  Visual Basic    (Miscelâneas)

Título da Dica:  Use GetInputState em Loops
Postada em 9/9/2003 por Ð@®l@n            
Alguns desenvolvedores sugerem que se coloque DoEvents em loops para manter sua aplicação responsiva. Isso nunca é uma boa idéia. Se o loop é pequeno, isso não é necessário; se o loop é longo, o código sofrerá uma queda de performance inaceitável. Mas e se você quiser que o seu usuário seja capaz de clicar em um botão Cancelar ou executar alguma outra ação enquanto o loop está sendo executado?

Um bom meio termo é chamar GetInputState. Essa função API retorna 1 se o usuário clicou em um botão do mouse ou pressionou uma tecla no teclado. O custo para se usar GetInputState é muito menor do que para DoEvents, logo, seus loops serão executados mais rapidamente. Se um evento do mouse ou teclado ocorrer, então você chama DoEvents. Em outras palavras, você chama a custosa DoEvents somente quando você de fato precisa dela para processar um evento. Você pode tornar o processo do loop ainda mais eficiente chamando GetInputState somente a cada x iterações (o número exato dependendo de quanto o tempo cada loop consome).

Option Explicit

Private Declare Function GetInputState Lib "user32" () As Long

Private mblnUserCancel As Boolean

Private Sub cmdCancelar_Click()
   ' O usuário cancelou o processo.
   mblnUserCancel = True
End Sub

Private Sub cmdGo_Click()
   Dim lngCounter As Long
   mblnUserCancel = False
   Me.MousePointer = vbHourglass

   ' Qualquer loop longo que possa precisar ser interrompido.
   For lngCounter = 0 To 10000000
      If lngCounter Mod 100 Then
         ' Entra aqui somente de 100 em 100 iterações.
         If GetInputState() <> 0& Then
            ' Um evento do mouse ou keyboard está na fila de
            ' mensagens, então, chamamos o DoEvents para que
            ' a mensagem seja processada.
            DoEvents
            If mblnUserCancel Then
               ' O usuário cancelou o processo.
               Exit For
            End If
         End If
      End If
   Next lngCounter

   Me.MousePointer = vbDefault
End Sub

Fonte: Daniel R. Buskirk (Nova Iorque, EUA)
 


CyberWEB Network Ltda.    © Copyright 2000-2024   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página