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