Makale numarası: 231298 - Son Gözden Geçirme: 13 Temmuz 2004 Salı - Gözden geçirme: 3.1

Visual Basic ile SetWaitableTimer nasıl kullanılır

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Özet

Birçok programcılar, programlarını yürütülmesini duraklatmak için uyku API işlevini kullanın. Uyku kullanarak olumsuzlukları, uygulamanın çalışan iş parçacığının duraklatır ve yeniden uygulama açtığı tüm penceresi düzgün çizilecek değil, biridir. Bu, kullanıcıya bir unattractive kullanıcı arabirimi sundukları. Uyku alternatif, ekranı yeniden boyamak için DDE iletileri ve benzeri sağlayan SetWaitableTimer kullanmaktır.

Daha fazla bilgi

Aşağıdaki kod örneği SetWaitableTimer apı kullanılışını gösterir.

Adım adım örnek

  1. Yeni bir proje standart exe DOSYASı, Visual Basic'te başlatın. Varsayılan olarak, Form1 oluşturulur.
  2. Iki CommandButtons Form1'ın getirin.
  3. Form1 kodu modüle aşağıdaki kodu yapıştırın:
    Option Explicit
    
    ' Sleep API is declared in the form to keep the
    ' SetWaitableTimer code in its own re-usable module.
    Private Declare Sub Sleep Lib "kernel32" ( _
        ByVal dwMilliseconds As Long)
    
    Private Sub Command1_Click()
        Command1.Enabled = False
        Wait 10 ' seconds
        Command1.Enabled = True
    End Sub
    
    Private Sub Command2_Click()
        Command2.Enabled = False
        Sleep 10000 ' milliseconds
        Command2.Enabled = True
    End Sub
    
    Private Sub Form_Load()
        With Form1
            .Height = 1400
            .Width = 2400
        End With
        With Command1
            .Move 100, 100, 2000, 300
            .Caption = "SetWaitableTimer"
        End With
        With Command2
            .Move 100, 500, 2000, 300
            .Caption = "Sleep"
        End With
    End Sub
    					
  4. Proje menüsünde Proje için yeni bir modül (Module1) eklemek için Add Module ' ı tıklatın.
  5. Module1 aşağıdaki kodu yapıştırın:
    Option Explicit
    
    Private Type FILETIME
        dwLowDateTime As Long
        dwHighDateTime As Long
    End Type
    
    Private Const WAIT_ABANDONED& = &H80&
    Private Const WAIT_ABANDONED_0& = &H80&
    Private Const WAIT_FAILED& = -1&
    Private Const WAIT_IO_COMPLETION& = &HC0&
    Private Const WAIT_OBJECT_0& = 0
    Private Const WAIT_OBJECT_1& = 1
    Private Const WAIT_TIMEOUT& = &H102&
    
    Private Const INFINITE = &HFFFF
    Private Const ERROR_ALREADY_EXISTS = 183&
    
    Private Const QS_HOTKEY& = &H80
    Private Const QS_KEY& = &H1
    Private Const QS_MOUSEBUTTON& = &H4
    Private Const QS_MOUSEMOVE& = &H2
    Private Const QS_PAINT& = &H20
    Private Const QS_POSTMESSAGE& = &H8
    Private Const QS_SENDMESSAGE& = &H40
    Private Const QS_TIMER& = &H10
    Private Const QS_MOUSE& = (QS_MOUSEMOVE _
                                Or QS_MOUSEBUTTON)
    Private Const QS_INPUT& = (QS_MOUSE _
                                Or QS_KEY)
    Private Const QS_ALLEVENTS& = (QS_INPUT _
                                Or QS_POSTMESSAGE _
                                Or QS_TIMER _
                                Or QS_PAINT _
                                Or QS_HOTKEY)
    Private Const QS_ALLINPUT& = (QS_SENDMESSAGE _
                                Or QS_PAINT _
                                Or QS_TIMER _
                                Or QS_POSTMESSAGE _
                                Or QS_MOUSEBUTTON _
                                Or QS_MOUSEMOVE _
                                Or QS_HOTKEY _
                                Or QS_KEY)
    
    Private Declare Function CreateWaitableTimer Lib "kernel32" _
        Alias "CreateWaitableTimerA" ( _
        ByVal lpSemaphoreAttributes As Long, _
        ByVal bManualReset As Long, _
        ByVal lpName As String) As Long
        
    Private Declare Function OpenWaitableTimer Lib "kernel32" _
        Alias "OpenWaitableTimerA" ( _
        ByVal dwDesiredAccess As Long, _
        ByVal bInheritHandle As Long, _
        ByVal lpName As String) As Long
        
    Private Declare Function SetWaitableTimer Lib "kernel32" ( _
        ByVal hTimer As Long, _
        lpDueTime As FILETIME, _
        ByVal lPeriod As Long, _
        ByVal pfnCompletionRoutine As Long, _
        ByVal lpArgToCompletionRoutine As Long, _
        ByVal fResume As Long) As Long
        
    Private Declare Function CancelWaitableTimer Lib "kernel32" ( _
        ByVal hTimer As Long)
        
    Private Declare Function CloseHandle Lib "kernel32" ( _
        ByVal hObject As Long) As Long
        
    Private Declare Function WaitForSingleObject Lib "kernel32" ( _
        ByVal hHandle As Long, _
        ByVal dwMilliseconds As Long) As Long
        
    Private Declare Function MsgWaitForMultipleObjects Lib "user32" ( _
        ByVal nCount As Long, _
        pHandles As Long, _
        ByVal fWaitAll As Long, _
        ByVal dwMilliseconds As Long, _
        ByVal dwWakeMask As Long) As Long
    
    Public Sub Wait(lNumberOfSeconds As Long)
        Dim ft As FILETIME
        Dim lBusy As Long
        Dim lRet As Long
        Dim dblDelay As Double
        Dim dblDelayLow As Double
        Dim dblUnits As Double
        Dim hTimer As Long
        
        hTimer = CreateWaitableTimer(0, True, App.EXEName & "Timer")
        
        If Err.LastDllError = ERROR_ALREADY_EXISTS Then
            ' If the timer already exists, it does not hurt to open it
            ' as long as the person who is trying to open it has the
            ' proper access rights.
        Else
            ft.dwLowDateTime = -1
            ft.dwHighDateTime = -1
            lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, 0)
        End If
        
        ' Convert the Units to nanoseconds.
        dblUnits = CDbl(&H10000) * CDbl(&H10000)
        dblDelay = CDbl(lNumberOfSeconds) * 1000 * 10000
        
        ' By setting the high/low time to a negative number, it tells
        ' the Wait (in SetWaitableTimer) to use an offset time as
        ' opposed to a hardcoded time. If it were positive, it would
        ' try to convert the value to GMT.
        ft.dwHighDateTime = -CLng(dblDelay / dblUnits) - 1
        dblDelayLow = -dblUnits * (dblDelay / dblUnits - _
            Fix(dblDelay / dblUnits))
        
        If dblDelayLow < CDbl(&H80000000) Then
            ' &H80000000 is MAX_LONG, so you are just making sure
            ' that you don't overflow when you try to stick it into
            ' the FILETIME structure.
            dblDelayLow = dblUnits + dblDelayLow
            ft.dwHighDateTime = ft.dwHighDateTime + 1 
        End If 
        
        ft.dwLowDateTime = CLng(dblDelayLow)
        lRet = SetWaitableTimer(hTimer, ft, 0, 0, 0, False)
        
        Do
            ' QS_ALLINPUT means that MsgWaitForMultipleObjects will
            ' return every time the thread in which it is running gets
            ' a message. If you wanted to handle messages in here you could,
            ' but by calling Doevents you are letting DefWindowProc
            ' do its normal windows message handling---Like DDE, etc.
            lBusy = MsgWaitForMultipleObjects(1, hTimer, False, _
                INFINITE, QS_ALLINPUT&)
            DoEvents
        Loop Until lBusy = WAIT_OBJECT_0
        
        ' Close the handles when you are done with them.
        CloseHandle hTimer
    
    End Sub
    					
  6. Projeyi çalıştırın.
  7. Uyku düğmesi'ni tıklatın. Uygulama uyurken, yeniden ekranın değil çizilecek olduğunu fark (üst uygulamasının başka bir pencereye sürükleyin ve yerine koyma sürükleyin). Daha sonra aynı sınama SetWaitableTimer düğmesini deneyin.

Referanslar

Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
184796  (http://support.microsoft.com/kb/184796/EN-US/ ) Bir zaman uyumsuz yordam çağrısı ile Waitable bir süreölçer nasıl kullanılır
Microsoft Win32 Software Developers Kit SetWaitableTimer, <a2>MsgWaitForMultipleObjects</a2> ve <a4>CloseHandle API çağrıları belgelemektedir.

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic 4.0 Professional Edition
Anahtar Kelimeler: 
kbmt kbapi kbhowto KB231298 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:231298  (http://support.microsoft.com/kb/231298/en-us/ )