Zum Inhalt springen

Gambas: Timer

Aus Wikibooks


Zurück zum Gambas-Inhaltsverzeichnis.


Das einfachste Timerprogramm

[Bearbeiten]

Ein Timer (Taktgeber) ist ein unsichtbares Steuerelement, das einen zeitlichen Ablauf programmierbar macht.

Wenn der Timer mit der Enabled-Eigenschaft an geschaltet ist, dann startet die Methode periodisch immer wieder mit der vorgegeben Zeitverzögerung (= Delay).

Platzieren Sie auf der Form einen Timer durch einen Klick auf das entsprechenden Feld der Werkzeugkiste.

Der Timer muss angeschaltet sein, wenn er laufen soll.

Deswegen schalten Sie seinen Eigenschaft Enabled im Eigenschaftsfenster (F4) auf TRUE.

Dann klicken Sie auf den Timer und geben Sie folgenden Code ein:

PUBLIC SUB Timer1_Timer()
  PRINT 1
END

Programmablauf:

Je nach dem wie groß man den Wert für das Delay einstellt, um so schneller oder langsamer erfolgt die Printausgabe. Diese wird immerwieder wiederholt.

Variation: Die Ausgabe wird mit einem Button gestoppt.

PUBLIC SUB Timer1_Timer()
  PRINT 1
END

PUBLIC SUB Button1_Click()
  Timer1.Enabled = FALSE
END

Delay zur Laufzeit ändern

[Bearbeiten]

Am Anfang steht der Timer immer auf einem Delay von 1000 Millisekunden und ist Disabled (Enabled = FALSE). Er muss also erst angeschaltet werden.

Diese Voreinstellungen kann man bei den Eigenschaften ändern oder auch programmieren.

Starten Sie ein neues Projekt Timer1. Holen Sie sich eine neue Form mit der Rechten Maustaste auf Form im Projekt. Nennen Sie die Form wie Sie wollen. Deklarieren Sie die Form als Startform.

Man kann die Zeitverzögerung im Timer in Millisekunden festlegen. Wenn der Timer mit der Enabled-Eigenschaft angeschaltet ist, dann startet die Methode Timer1_Timer() periodisch mit der vorgegeben Zeitverzögerung.

Platzieren Sie auf der Form einen Timer und 2 Befehlsbuttons durch Klick auf die entsprechenden Felder der Werkzeugkiste.

Das Ganze schaut dann so aus: Verschieben Sie ihre Form so, dass Sie das Direktfenster sehen!

Der Programmcode dazu:

' Gambas class file

PUBLIC n AS Integer

PUBLIC SUB Form_Open()
  Timer1.Enabled = TRUE
END

PUBLIC SUB Timer1_Timer()
  PRINT Timer1.Delay
  Timer1.Delay = 1000 + n
END

PUBLIC SUB Button1_Click()
  n = n + 200
END

PUBLIC SUB Button2_Click()
  n = n - 200
END

Programmablauf: Der Delay-Wert kann jetzt schneller oder langsamer geschaltet werden

Variation:

Wenn Sie ihrem Formular noch eine TextArea hinzufügen, dann erfolgt die Anzeige in der TextArea, wenn Sie folgende Codevariation nutzen.

' Gambas class file

PUBLIC n AS Integer

PUBLIC SUB Form_Open()
  Timer1.Enabled = TRUE
END

PUBLIC SUB Timer1_Timer()
  TextArea1.Text = Timer1.Delay & "\n" & TextArea1.Text
  Timer1.Delay = 1000 + n
END

PUBLIC SUB Button1_Click()
  n = n + 200
END

PUBLIC SUB Button2_Click()
  n = n - 200
END

Das Delay mit Zufallszahlen verändern

[Bearbeiten]

Im folgenden kleinen Programm werden Zufallszahlen zwischen 1 und 25 erzeugt. Diese Zahlen werden im Direktfenster ausgegeben und gleichzeitig wird das Delay des Timers je nach Größe der Zahl verändert. Um das Programm in Gang zu bringen brauchen Sie eine Form und darauf ein Timer-Steuerelement. Dieses holen Sie sich mit F6 aus der Toolbox.

PUBLIC SUB Form_Open()
  Timer1.Enabled = TRUE
END

PUBLIC SUB Timer1_Timer()
  x AS Integer 
  Randomize
  x = Int(Rnd(1,25))
  PRINT x
  Timer1.Delay = x * 50
END

Ziemlich nutzlos dieses Programm, aber man kann sich mit dem Timer vertraut machen und ein bisschen mit Zufallszahlen herumspielen.

Countdown

[Bearbeiten]

Dieses Programm stammt von Jonás Alvarez. Siehe: linuxfocus.org

Es wurde ins Deutsche übertragen, verbessert und kommentiert:

Sie brauchen einen Timer, eine TextBox, einen ToggleButton, ein Labelfeld und 2 Commandbuttons, um es in Gang zu bekommen.

Der Code:

CONST fStandart AS Float=20.0
fSekunden AS Float
'fSekunden wird schon außerhalb aller Unterprogramme definiert,
'so kann es in allen UPs benutzt werden.
'fSekunden ist die aktuelle Zeit in Sekunden bis zum Start
'fStandart ist die Zeit des Countdownbeginns. 
'Sie ist als Konstante festgelegt.
'fStandart kann aber über den Reset-Commandbutton Button1_Click()
'und die Textbox verändert werden.

PUBLIC SUB Form_Open()
  'bereits beim Programmstart wird einiges festgelegt und angezeigt
  fSekunden = fStandart
  Anzeige
  ToggleButton1.Value = FALSE
  AnAus
  Textbox1.Text = fSekunden
END

PUBLIC SUB ToggleButton1_Click()
  'das ist der wichtigste Knopf
  'er startet den Countdown oder unterbricht ihn
  Timer1.Enabled = Togglebutton1.Value
  'Ist der Togglebutton gedrückt kann auch der Timer laufen.
  'Togglebutton1.Value = True >> Timer1.Enabled = True 
  'Ist er nicht gedrückt steht der Timer still
  'Togglebutton1.Value = False >> Timer1.Enabled = False 
  AnAus
END

PUBLIC SUB Button1_Click()
  fSekunden = Val(Textbox1.Text)
  Anzeige
END

PRIVATE SUB AnAus()
  IF ToggleButton1.Value THEN
    ToggleButton1.Text = "&Countdown läuft"
  ELSE
    ToggleButton1.Text = "&Unterbrechung"
  ENDIF
  'wenn der Togglebutton angeklickt wurde erscheint als Text:
  'Countdwon läuft.
  'ist er nicht angeklickt erscheint der Text Unterbrechung
END

PRIVATE SUB Anzeige()
  DIM fMinuten AS Integer
  fMinuten = Int(Int(fSekunden) / 60)
  'der Befehl INt schneidet die Nachkommazahlen weg
  'das passiert hier gleich 2 mal
  'erst werden die hundertstl Sekunden gekappt
  'dann wird nach Minuten umgerechnet und auch hier alles nach dem Komma gekappt.
  Label1.Caption = fMinuten & ":" & Format(fSekunden - fMinuten * 60, "00.0")
  'der Formatbefehl bietet viele Möglichkeiten.
  'Schauen Sie ihn sich einmal mit F1 in der Hilfe an
END

PUBLIC SUB Timer1_Timer()
  IF fSekunden < 0.1 THEN
    Label1.Caption = "0:00,0"
    Togglebutton1.Value = FALSE
    Togglebutton1_Click
    'Hier wird aus dem Programm heraus der Togglebutton abgeschaltet
    'da der Countdown kurz vor der Null ist
    'das Programm springt zum Unterprogramm Togglebutton1_Click
  ELSE
    fSekunden = fSekunden - 0.1
    Anzeige
  END IF
END

PUBLIC SUB Button2_Click()
  ME.Close
END

Drückt man auf den ToggleButton beginnt die Uhr rückwärts zu zählen. Drückt man noch einmal darauf, wird der Countdown unterbrochen. Mit Reset kann man über die Textbox den Beginn des Countdown verändern.

Das Programm hat 2 Prozeduren AnAus und Anzeige.

Reaktionszeit testen

[Bearbeiten]

Mit diesem kleinen Programm wird die Reaktionszeit gemessen.

Für dieses Programm wird die Timer-Funktion benutzt. Diese sollte man nicht mit dem Timersteuerelement verwechseln. Außerdem wird die Anzeige Bremsen erst nach einer anfänglichen Zufallszeit ausgegeben.

Sie brauchen 3 Befehlsbuttons und eine Textbox um das Programm in Gang zu bringen. Das Programm ist noch verbesserungsbedürftig, aber es funktioniert.

Programmcode:

fStart AS Float

PUBLIC SUB Button1_Click()
  fZufall AS Float
  i AS Integer

  Randomize()

  fZufall = Rnd(0.5, 3) 
  'PRINT fZufall
  WAIT fZufall
  
  TextBox1.Text = "Bremsen!!!"
  
  fStart = Timer 'Anfangszeit festlegen. 
  'erst ab jetzt wird die Reaktionszeit gemessen 
END

PUBLIC SUB Button2_Click()
  fReaktionszeit AS Float
  
  fReaktionszeit = Timer - fStart 
  fReaktionszeit = Int(fReaktionszeit * 1000)  
  TextBox1.Text = fReaktionszeit
  'TextBox1.Text = "Sie haben " + Str$(fReaktionszeit) + " Millisekunden gebraucht, um zu bremsen!" 
END

PUBLIC SUB Button3_Click()
  ME.Close 
END

Der Wait-Befehl, eine Alternative zum Timer

[Bearbeiten]

In einer Schleife ist es gar nicht so einfach den Timer korrekt zu programmieren. Versuchen Sie es einfach einmal mit dem WAIT Befehl als Alternative.

Die Syntax des Befehls lautet:

WAIT [ Delay ] 

Der Befehl ruft die Ereignisschleife auf. Wenn für Delay ein Wert angegeben wird, dann wartet der Computer bis die angegebene Zeitverzögerung verstrichen ist. Die Zahl Delay ist eine Fließkommazahl. Wenn Sie also 100 ms warten wollen, dann geben Sie folgendes ein:

 WAIT 0.1

Während der Pause werden keine Maus- oder Tastatureingaben verarbeitet. Nur Zeichnungs-, Timer- und Dateibeschreibungsereignisse werden noch ausgeführt.

Ein kleines Miniprogramm zeigt die Nutzung des Befehls. Sie brauchen einen Befehlsbutton und eine Textbox um es in Gang zu bringen. Sie müssen 5 Sekunden warten bis etwas passiert.

PUBLIC SUB Button1_Click()
  WAIT 5
  'wartet 5 Sekunden 

   WAIT 0.1 
  'wartet 100 Millisekunden 

  TextBox1.Text = ""
END

Oder was sagen Sie zu diesem Programm mit dem wandernden Befehlsknopf: Sie brauchen eine Form und einen Button um es in Gang zu bringen.

PUBLIC SUB Button1_Click()
  DIM x AS Integer 
  FOR x = 1 TO 20
    Button1.X = x * 10 
    Button1.Y = x * 10
    WAIT 0.5
    Button1.Text =  Str(x)
  NEXT 
END