Die Community zu .NET und Classic VB.
Menü

Klasse: Multiinstanz Timer Klasse

 von 

Multiinstanz Timer Klasse  

Multiinstanz Timer Klasse in VB6 ohne zusätzliches Modul

Der TimerCallBack wird über in die Klasse eingebunden Assemblercode gehandelt. VB stuertzt leider ab, wenn Stop gedrueckt wird, solange ein Timer aktiv ist.

Der AssemblerCode selbst macht nichts weiter, als den CallBackAufruf der Windows TimerProcedure entgegenzunehmen, und mit den mit den nötigen zusätzlichen Parametern versehen, an TimerProc in cTimer weiterzuleiten.


Abbildung 1: Screenshot

Die Zipdatei enthält auch ein Beispielprojekt

Geschrieben wurde die Klasse von

Download cTimer.zip [5188 Bytes]

Ihre Meinung  

Falls Sie Fragen zu diesem Artikel haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.

Archivierte Nutzerkommentare 

Klicken Sie diesen Text an, wenn Sie die 2 archivierten Kommentare ansehen möchten.
Diese stammen noch von der Zeit, als es noch keine direkte Forenunterstützung für Fragen und Kommentare zu einzelnen Artikeln gab.
Aus Gründen der Vollständigkeit können Sie sich die ausgeblendeten Kommentare zu diesem Artikel aber gerne weiterhin ansehen.

Kommentar von XETH am 19.07.2008 um 12:40

Es wäre gut, wenn man bei Asm-Tipps immer die VirtualMemory Klasse benutzen würde, damit es wegen des XD-Bit-Verhaltens keine Abstürze gibt.

Kommentar von Udo Schmidt am 18.07.2008 um 14:49

Hallo, Stefan!

Da das Klassenmodul (ungenutzt) GWL_WNDPROC und CallWindowProc enthält, nehme ich an, es ist aus dem dieser Tage von XETH im VB-Forum diskutierten subclassing-Modul entstanden. Wie im Forum erwähnt, halte ich es für sinnvoll, Zeilen wie "asm(x) = Wert" zu verwenden, anstatt per CopyMemory Werte mitten in den Code zu kopieren. Das macht es m.E. übersichtlicher, auch für nicht asm-kundige Leser nachvollziehbar und reduziert den notwendigen Code nicht unerheblich (folgender Änderungsvorschlag enthält nur noch halb so viele Codezeilen und paßt daher auf einen Bildschirm).

Udo

Option Explicit

Event Timer(ByVal ThisTime As Long)

Dim asm(0 To 5) As Long ' AsseblerCode
Dim TimerID As Long ' got from SetTimer

Private Declare Function SetTimer Lib "user32" _
(ByVal hWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByRef lpTimerFunc As Any) As Long

Private Declare Function KillTimer Lib "user32" _
(ByVal hWnd As Long, _
ByVal nIDEvent As Long) As Long

Private Sub Class_Initialize()
asm(0) = ObjPtr(Me)
' --------------------------------------------------------------------------
asm(1) = &HE8: asm(2) = &H408B5800: asm(3) = &HC48359F7
asm(4) = &H8B51500C: asm(5) = &H1C60FF00
End Sub

Private Sub Class_Terminate()
DestroyTimer
End Sub

' Has to be first public procedure !
Public Sub TimerProc(ByVal dwTime As Long)
RaiseEvent Timer(dwTime)
End Sub

Public Function CreateTimer(MilliSeconds As Long) As Long
DestroyTimer
If MilliSeconds Then TimerID = SetTimer(0, 0, MilliSeconds, asm(1))
CreateTimer = TimerID
End Function

Public Function DestroyTimer() As Long
If TimerID Then KillTimer 0, TimerID
TimerID = 0
End Function