Re: Zur Laufzeit generierter Timer - Name



interessant was sich hier alles ergeben hat.
Ich sehe in der Tat für mich noch keinen Weg der an mehreren Timern vorbei
führt. Kannst du mir das mit "Gameloops" etwas genauer erklären? Wie
bekommst du damit alles in einen Timer?

Hallo Manfred,
eine GameLoop ist eigentlich nichts anderes als eine Schleife die ständig
durchlaufen wird.
\\\
Module Module1
Private Jobs As New List(Of JobClass)
Private dt As Int64
Private dt1 As Int64
Private FRM As New Form1
Private STPW As New System.Diagnostics.Stopwatch

Public Sub Main()
Dim Job As New JobClass
Job.Interval = 1800
Job.Method = New MethodInvoker(AddressOf DoWork1)
Jobs.Add(Job)

Job = New JobClass
Job.Enabled = False
Job.Interval = 2100
Job.Method = New MethodInvoker(AddressOf DoWork2)
Jobs.Add(Job)

Job = New JobClass
Job.Interval = 1100
Job.Method = New MethodInvoker(AddressOf DoWork3)
Jobs.Add(Job)

FRM.Show()
STPW.Start()
Do While FRM.Created '<< Hier ist die GameLoop
Application.DoEvents()
Worker()
Threading.Thread.Sleep(1)
Loop
End Sub

Private Sub Worker()
dt = STPW.ElapsedMilliseconds
For Each job As JobClass In Jobs
If job.Enabled Then
dt1 = dt - job.LastCallTime
If dt1 >= job.Interval Then
job.LastCallTime = dt
job.Method.Invoke()
End If
End If
Next
End Sub

Private Sub DoWork1()
Console.WriteLine("DoWork1 {0} ms later", dt1)
End Sub

Private Sub DoWork2()
Console.WriteLine("DoWork2 {0} ms later", dt1)
End Sub

Private Sub DoWork3()
Console.WriteLine("DoWork3 {0} ms later", dt1)
End Sub
End Module

Public Class JobClass
Public Enabled As Boolean = True
Public LastCallTime As Int64
Public Interval As Integer
Public Method As MethodInvoker
End Class
///
///
Die GameLoop beinhaltet einmal den DoEvents-Aufruf damit die
Ereignissteurung auch funktioniert und ein Sleep. Letzeres beinträchtig zwar
etwas die Genauigkeit führt aber dazu, dass das System nicht ständig
ausgelastet ist. Kannst den Aufruf mal auskommentieren und Die im
Taskmanager den Unterschied anschauen.
Die Worker-Methode prüft dann hinsichtlich der aktuellen Zeit, der letzten
Aufrufzeit und des geforderten Intervals ob irgendetwas ausgeführt werden
muss. Vorab wird natürlich geprüft ob der Job überhaupt ausgeführt werden
soll(siehe Enabled-Eigenschaft).
Die Überwachung der Zeit geschieht hier mit einer Stopwatch, da diese eine
höhere Genauigkeit besitzt als beispielsweise Now.
Interessant ist vielleicht noch der MethodInvoker. Er beinhaltet die Methode
die für den Job aufgerufen werden soll.
Wie Du siehst brauchst Du nicht einen einzigen Timer und hast trotzdem eine
zeitliche Steuerung. Zum Einsatz kommt die Art der Steuerung hauptsächlich
bei Spielen(deswegen GameLoop), ist aber auch sehr gut für die Steuerung von
Peripherie(Schrittmotoren etc.) geeignet. Mit einem Timer bekommst Du nie so
ein Ergebnis.
P.S.: Dass die Stopwatch überläuft, braucht man keine Angst zu haben. Das
passiert erst nach ca. 297Mio. Jahren.
--
Gruß Scotty


.



Relevant Pages

  • Re: Memory problem with XML::DOM::Parser???
    ... >> # Die Anfrage ist Teil der neuen EPA ... # Modul für die XML-Funktionen des Clients ... # Subroutine, um die XML-Struktur aus dem XML-Rootfile und den ... sub construct_xml { ...
    (comp.lang.perl.misc)
  • Re: Multitasking
    ... Private Sub C1_Ausgeschlafen ... Der Timer auf Form1 zeigt in der Titelleiste in ... bis 15 Sekunden wird in der Sub1 das Ereignis ...
    (microsoft.public.de.vb)
  • Re: Hintergrundfarbe einer Pulldown-Menueleiste
    ... Die Farben der Menüs kann man ab Win98/Win2000 über die API Funktion ... Private Type MENUINFO ... Private Sub Form_Unload ...
    (microsoft.public.de.vb)
  • Threading - Objekte mit gleicher Zeitbasis
    ... ich habe eine Klasse aus der erstelle ich 2 Objekte. ... Private Ticker As New System.Timers.Timer ... Private Sub Form2_Click ... Wie kann ich die Threads so synchronisieren, ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Terror in the South: 55 schools closed
    ... unbedingten Gehorsam leisten und als tapferer Soldat bereit ... Den gewaltigsten Gegensatz zum Arier bildet der Jude. ... Als bester Beweis hierfür darf die ... sich im Verlaufe der Jahrtausende geschult. ...
    (soc.culture.thai)