Re: Zur Laufzeit generierter Timer - Name
- From: "Karsten Sosna" <k.sosna-NO-SPAM-@xxxxxxxxxxx>
- Date: Sun, 30 Mar 2008 10:20:17 +0200
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
.
- Follow-Ups:
- Re: Zur Laufzeit generierter Timer - Name
- From: Manfred Müller
- Re: Zur Laufzeit generierter Timer - Name
- References:
- Zur Laufzeit generierter Timer - Name
- From: Manfred Müller
- Re: Zur Laufzeit generierter Timer - Name
- From: Armin Zingler
- Re: Zur Laufzeit generierter Timer - Name
- From: Manfred Müller
- Re: Zur Laufzeit generierter Timer - Name
- From: Karsten Sosna
- Re: Zur Laufzeit generierter Timer - Name
- From: Armin Zingler
- Re: Zur Laufzeit generierter Timer - Name
- From: Karsten Sosna
- Re: Zur Laufzeit generierter Timer - Name
- From: Manfred Müller
- Zur Laufzeit generierter Timer - Name
- Prev by Date: Re: Grafische Auswahl von Zeiten
- Next by Date: Re: Zur Laufzeit generierter Timer - Name
- Previous by thread: Re: Zur Laufzeit generierter Timer - Name
- Next by thread: Re: Zur Laufzeit generierter Timer - Name
- Index(es):
Relevant Pages
|
|