GAAnalytics4

2007-08-07

Döngü İçindeki DoEvents()

Eğer bir döngü içindeyken ekranda bir kaç değişiklik(Update,Refresh) yapmak istiyorsak(Progress Bar,Status Bar) bu oldukça kaynak tüketen birşeydir...

Örneğin :

pb.Value = 0
    For Each temp As DataRow in tempTable.Rows    
        Dim tur as integer = Cint(temp.Item("TUR"))        
        Select Case Tur            
            'Case...            
            'Burda döngü içindeki işlerimiz        
        End Select  
    'şimdi progress Bar'ımızı Update edelim    
    pb.PerformStep()  
    pb.Refresh()  
    Applicaton.DoEvents()
   Next

Yukarda kod her döngüye girdiğinde "Application.DoEvents()" ile kuyrukda bekleyen bütün mesajlar çağırılacaktır.Bu durumda ise sisteme ekstra bir yük binecektir.

Oysa WinAPI kullanarak bu yükü biraz azaltabiliriz.User32.dll de bulunan "GetQueueStatus" fonksiyonu bize yardımcı olacaktır.

Public Const QS_MOUSEBUTTON = &H4
Public Const QS_MOUSEMOVE = &H2
Public Const QS_MOUSE As Long = (QS_MOUSEMOVE Or QS_MOUSEBUTTON)
<system.runtime.interopservices.dllimport(>"user32.dll")> _
  Public Shared Function GetQueueStatus(ByVal qsFlags As Integer) As Integer
  End Function
 
Public Sub YeniDoEvents()
    If GetQueueStatus(QS_MOUSE) <> 0 Then
        'Eğer Fare Sürüklenmiş veya Tıklanmışsa
        Application.DoEvents()
    End If 
End Sub
'....
'....
'....
 
pb.Value = 0    
    For Each temp As DataRow in tempTable.Rows            
        Dim tur as integer = Cint(temp.Item("TUR"))                
            Select Case Tur                        
            'Case...                        
                'Burda döngü içindeki işlerimiz                
            End Select      
        'şimdi progress Bar'ımızı Update edelim        
        pb.PerformStep()      
        pb.Refresh()      
        'Şimdi Kendi DoEvents()'imizi çağırıyoruz
        YeniDoEvents()
    Next