Timer und Funktion



  • ich habe eine Funktion die über einen Timer mehrmals ausgeführt werden soll. Was kann ich tun, dass die Funktion nach einer vorgegebenen Anzahl aufgerufen wird? Der Timer soll zB nur 100 mal das Ereignis auslösen.



  • Einen Zähler mitlaufen lassen und eine entsprechende Abbruchbedingung einbauen.



  • das ich eine for-Schleife brauch war klar. Nu wie genau mach ich das? Wenn ich in den Zähler die Scheife schreibe wird diese ja bei jedem Timerereignis erst durchlaufen.

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
       for (int i=0; i<=MAX; i++) {
          ErfasseMessdaten();
          }
    }
    

    Der Zähler soll aber nur nach jedem Ereignis weiterzählen. Dann müsste es gehen.



  • Du musst eine globale Zählervariable deklarieren.

    Und im Timerereignis hochzählen. Gleichzeitig prüfst du im Timerereignis, ob
    die Zählervariable kleiner als 100 ist. Wenn ja, dann Funktion ausführen.

    So wird deine Funktion 100 Mal aufgerufen:

    int count = 0;
    
    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
     count ++;
     if(count < 100)
     {
      ErfasseMessdaten();
     }
     else
     {
      Timer1->Enabled = false;
     }
    }
    


  • Kurzer Zusatz noch: Eine statische Zählvariable innerhald der Timer-Routine würde auch gehen (würde ich sogar vorziehen, weil man diesen Zähler nur in dieser Routine benötigt).



  • Das wäre dann die DeLuxe-Lösung 🙂



  • supi, das funktioniert schon mal. Hier mein Code:

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        static int counter = 0;
        counter++;
        if(counter <= 100) {
           ErfasseMessdaten();
           }
        else {
           Timer1->Enabled = false;
           counter = 0;
           }
    }
    

    nur eine Sache fehlt noch.
    Der Timer ist zu Beginn deaktiviert. Ich starte ihn per Button-Klick. Die Funktion füllt einen Vektor mit Daten. In diesem Fall also die ersten 100 Elemente. Damit er beim zweiten Klick auf den Button weitermacht musste ich noch den counter auf 0 setzen.


Anmelden zum Antworten