Interval Timer Function
Download
- Quelltext (4 kB)
- MIT-Lizenz
- Plattformen:
- keine Angabe
- Quelltext enthalten
- Angelegt von Juppel am 18.12.2021
Bewertung
Bisher keine Bewertung(Zum Abstimmen auf die Sterne klicken.)
Programm Code zu einem bestimmten Zeitpunkt auslösen
dabei die Programmlaufzeit berücksichtigen und die Übergelaufende Zeit zurückgeben.
Do
'average_throughput_time 'die durchlaufzeit ermitteln
Print "Do ...."
If Interval(5) Then
Print "interval_timeoverflow : ";interval_timeoverflow
PRINT "maxinterval_throughput_time: "; maxinterval_throughput_time
Print "Hello World"
EndIf
sleep 200
Loop
Die Funktion:
Dim Shared interval_timeoverflow As Double
Dim Shared intervalTimerStart(100) As Double
Dim Shared As DOUBLE maxinterval_throughput_time
DIM Shared AS DOUBLE LastTimer(100)
DIM Shared As Integer TimeDim(100)
#define average_throughput_time interval(0)
FUNCTION interval(x1 AS INTEGER) AS DOUBLE
'den interval ermitteln, wenn dieser Teilbar ist, also kein Rest übrig bleibt
'dann ist die Zeit erreicht.
'falls der richtige Zeitpkt. nicht abgefangen wird, da der Programmablauf
'irgendwo stoppt, dann muss der größte und kleinste Rest überwacht werden.
'Wenn der Rest wieder kleiner wird, dann ist der Zeitpkt erreicht. oder 0
'falls der Zeitpunkt nicht erreicht wird, wird auch die Überschrittene Zeit
'zurückgeliefert, dann kann der Benutzer dies im Programm ausgleichen
'Interval_Timeoverflow
'z.B. Interval(2), das Programm benötigt aber 4Sekunden pro durchlauf.
'dann geht er nach 4 Sek. in diese Function und gibt 2 Sekunden zurück an Interval_Timeoverflow
'
'die überschrittene Zeit wird dann in der Function ausgeglichen.
'nachteil: je nach Systemzeit wird das Programm schon zu früh, evtl. nach 5 Sek statt im Interval
'gewählten 10Sek. ausgelöst
Dim nowTimer As Double
Dim EndTimer As Double
Dim xdiff As Integer
Dim x As Integer
Dim I As Integer
nowTimer=TIMER
'die durchlaufzeit des Programms ermitteln und den Timer x entsprechend anpassen
'wenn dieser zu niedrig gewählt wurde
If x1=0 Then
If maxinterval_throughput_time<nowTimer-LastTimer(0) And LastTimer(0)>0 Then maxinterval_throughput_time=nowTimer-LastTimer(0)
LastTimer(0)=nowTimer
Exit Function
EndIf
' wenn er pro durchlauf 4 Sek. benötigt und alle 2 Sek. abgefragt werden soll,
'dann fragt er beim nächsten mal alle 6 Sek. ab, da er zur Sichereiheit noch 2 Sek drauf legt
'aber z.Zt nicht nötig
'If x1<interval_throughput_time Then
' xdiff=x1
' x1=Int(interval_throughput_time)
' xdiff=x1-xdiff
'EndIf
'x=x1
'---------------------------------------------------
'Speicherzelle Suchen in der die Zeit hinterlegt ist.
'hatte leider keine bessere Lösung
For I=1 To 100
If TimeDim(i)=x1 Then
x=i
Exit For
EndIf
Next I
'wenn die Zeit noch nicht ermittelt wurde, dann eine freie Speicherzelle
'suchen und beschreiben
If x=0 Then
For I=1 To 100
If TimeDim(I)=0 Then
TimeDim(I)=x1
x=I
Exit For
EndIf
Next I
EndIf
'---------------------------------------------------
EndTimer=(nowTimer)/x1-Int((nowTimer)/x1)
IF EndTimer<LastTimer(x) or nowTimer-intervalTimerStart(x)> x1 And intervalTimerStart(x)>0 Then
If IntervalTimerStart(x)>0 Then
interval_timeoverflow= (nowTimer-intervalTimerStart(x))
EndIf
IntervalTimerStart(x)=nowTimer
LastTimer(x)=0
Return True
Else
LastTimer(x)=EndTimer
Return False
EndIf
END FUNCTION