|
|
|
|
|
Dicas
|
|
Visual Basic (Miscelâneas)
|
|
|
Título da Dica: Alguns desenvolvedores sugerem que se coloque DoEvents em loops para manter sua aplicação responsiva
|
|
|
|
Postada em 27/10/2003 por [_Chuck_]
Use GetInputState em Loops Autor: Daniel R. Buskirk (Nova Iorque, EUA)
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
|
|
|
|
|