Uhr die rückwärts zählt



  • Brauche ganz dringend eine Uhr die mir 12Minuten rückwärts zählt. So dass ich jede Sekunde sehe.
    Muss unbedingt bis morgen fertig sein, da wir da ein Hallentunier haben und die Anzeigetafel gester kaputt ging,
    Bitte um Hilfe!



  • nimm ne stoppuhr und uebe kopfrechnen 🤡

    - #include <ctime>
    - t = time() + 12*60
    - usleep oder sleep oder Sleep des jeweiligen betriebssystems fuer eine bruchsekunde
    - printf ("%d sekunden", t-time());



  • Kannst du mir keine genauen Angaben machen. Bin absoluter Anfänger was das Programmieren angeht.



  • edit: code ist fehlerhaft, auf der naechsten seite korrigiert
    edit: doch nicht fehlerhaft, alles okay

    #include <cstdio>
    #include <ctime>
    #include <cmath>
    
    #ifdef __WIN32__
    #include <windows.h>
    #define usleep(n) Sleep((n)/1000)
    #else
    #include <unistd.h>
    #endif
    
    double mytime()
    {
        return (double) clock() / CLOCKS_PER_SEC;
    }
    
    int main()
    {
        getchar();
        double t = mytime() + 12 * 60, x;
    
        do
        {
            x = t - mytime();
            printf("%02dm %04.1fs\r", (int) (x / 60), fmod(x, 60));
            usleep(50000);
        } while (x >= 0);
    
        puts("Zeit abgelaufen!");
    
        return 0;
    }
    


  • Da kommt ein Fehler, dass <unistd.h> nicht geöffnet werden kann!



  • bronstein2 schrieb:

    Da kommt ein Fehler, dass <unistd.h> nicht geöffnet werden kann!

    Das "oder" ist exklusiv gemeint. D.h. entweder du inklduierst <windows.h> oder <unistd.h>. Nicht beides. <windows.h> macht sinn, wenn du unter Windows arbeitest. <unistd.h>, wenn du unter einem Posix-OS wie z.B. Linux arbeitest.



  • Bei mir kommt unter Linux ein fehler:

    werner@linux:~> cd /home/werner/code
    werner@linux:~/code> g++ countdown.cpp -o countdown.exe
    countdown.cpp: In function int main()': countdown.cpp:16: error:Sleep' undeclared (first use this function)
    countdown.cpp:16: error: (Each undeclared identifier is reported only once for
    each function it appears in.)
    werner@linux:~/code>

    `sleep´ wird nicht erkannt. So sieht mein dode aus:

    #include <iostream>
    #include <ctime>
    
    #define usleep(n) Sleep((n)/1000)
    #include <unistd.h>
    
    using namespace std;
    
    int main()
    {
        cin.get();
        unsigned long t = time(0) + 12*60, x;
        do {
            x = t - time(0);
            cout << "\r" << (x/60) << ":" << (x%60);
            usleep(100000);
        } while (x >= 0);
        cout << "Zeit abgelaufen!";
        return 0;
    }
    


  • ich habs idiotensicher gemacht.
    einfach kompilieren und ausfuehren.



  • c.rackwitz schrieb:

    ich habs idiotensicher gemacht.
    einfach kompilieren und ausfuehren.

    Offensichtlich nicht 🕶

    Wenn ich dir eines sagen kann dann, dass es immer einen Idioten geben wird der auch das "idiotensicherste" fehlschlagen lässt.



  • idioten sollten ausgestorben werden! (satzbau beabsichtigt)



  • anscheinend hast du es nicht idiotensicher gemacht du troll.
    Denkst du ich habe mir den Fehler nur ausgedacht?? Villeicht kannst du entlich mal aufhören alles nutzlos und dumm zu komentieren und mir helfen. Den ehrlich gesagt nervst du mich schon genauso wie TGGC. Der schreibt auch immer nur 3 Wörter und meistens passen sie nie zum Thema.



  • ... probier es nochmal mit dem quelltext, der jetzt in dem post steht.
    ich HABE den quelltext so geaendert, dass du nicht mehr dein hirn bemuehen musst.



  • ... probier es nochmal mit dem quelltext, der jetzt in dem post steht.

    dankeschön, es funktionier 🙂

    ich HABE den quelltext so geaendert, dass du nicht mehr dein hirn bemuehen musst.

    erstmal sollte villeicht geklärt werden, ob ich ein´s habe.



  • poroblem schrieb:

    ... probier es nochmal mit dem quelltext, der jetzt in dem post steht.

    dankeschön, es funktionier 🙂

    ich HABE den quelltext so geaendert, dass du nicht mehr dein hirn bemuehen musst.

    erstmal sollte villeicht geklärt werden, ob ich ein´s habe.

    jo das sollte wirklich geklärt werden



  • Irgendwas stimmt noch nicht bei der Minuten anzeige. Wenn zum beispiel die 7.Minuten vorüber ist wird nicht auf sechs geschaltet. Erst nach 30 Sekunden wird sie auf sechs geschaltet.



  • kann ich nicht nachvollziehen...
    hast du vielleicht irgendein round() in den code reingemacht?



  • Nein,
    hier mal mein Code, habe zur Anzeige ein Formular benutzt:
    Code des Threads.cpp

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit2.h"
    #include "Unit1.h"
    #include <iostream>
    #include <ctime>
    
    #include <windows.h>
    #define usleep(n) Sleep((n)/1000)
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //   Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur
    //   in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
    //
    //      Synchronize(UpdateCaption);
    //
    //   wobei UpdateCaption so aussehen könnte:
    //
    //      void __fastcall timer::UpdateCaption()
    //      {
    //        Form1->Caption = "In Thread aktualisiert";
    //      }
    //---------------------------------------------------------------------------
    
    __fastcall timer::timer(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall timer::Execute()
    {
            //---- Hier den Thread-Code plazieren----
            String Text;
                unsigned long t = time(0) + 12*60, x;
        do {
            x = t - time(0);
            //cout << "\r" << (x/60) << ":" << (x%60);
            Text =  IntToStr(x/65) + ":" + IntToStr(x%60);
            Form1->Edit1->Text= Text;
            //Form1->Edit1->Refresh();
            usleep(100000);
        } while (x >= 0);
    }
    //---------------------------------------------------------------------------
    

    Code des Threads.h

    //---------------------------------------------------------------------------
    
    #ifndef Unit2H
    #define Unit2H
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    //---------------------------------------------------------------------------
    class timer : public TThread
    {            
    private:
    protected:
            void __fastcall Execute();
    public:
            __fastcall timer(bool CreateSuspended);
    };
    //---------------------------------------------------------------------------
    #endif
    

    Code des Formulars:

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit1.h"
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    
    void __fastcall TForm1::FormCreate(TObject *Sender)
    {
    timer *SecondProcess = new timer(true);
      SecondProcess->Priority = tpLower; // niedrigere Priorität setzen
      SecondProcess->Resume(); // Thread jetzt ausführen
    }
    //---------------------------------------------------------------------------
    


  • omfg, threads fuer sowas? borland hat doch timer!
    ich setz mal den rotstift an... (geht nur in code tags)

    //---------------------------------------------------------------------------
    
    #include <vcl.h>
    #pragma hdrstop
    
    #include "Unit2.h"
    #include "Unit1.h"
    #include <iostream>
    #include <ctime>
    
    #include <windows.h>
    #define usleep(n) Sleep((n)/1000)
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    
    //   Wichtig: Methoden und Eigenschaften von Objekten der VCL können nur
    //   in Methoden verwendet werden, die Synchronize aufrufen, z.B.:
    //
    //      Synchronize(UpdateCaption);
    //
    //   wobei UpdateCaption so aussehen könnte:
    //
    //      void __fastcall timer::UpdateCaption()
    //      {
    //        Form1->Caption = "In Thread aktualisiert";
    //      }
    //---------------------------------------------------------------------------
    
    __fastcall timer::timer(bool CreateSuspended)
            : TThread(CreateSuspended)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall timer::Execute()
    {
            //---- Hier den Thread-Code plazieren----
            String Text;
                unsigned long t = time(0) + 12*60, x;
        do {
            x = t - time(0);
            //cout << "\r" << (x/60) << ":" << (x%60);
            Text =  IntToStr(x/[b]60[/b]) + ":" + IntToStr(x%60);
            Form1->Edit1->Text= Text;
            //Form1->Edit1->Refresh();
            usleep(100000);
        } while (x >= 0);
    }
    //---------------------------------------------------------------------------
    

    ich wuerde mich freuen, wenn du meinen aktuellen code benutzen wuerdest. dann haettest du auch bruchsekunden und eine wesentlich genauere zeitmessung.



  • Text =  IntToStr(x/65) + ":" + IntToStr(x%60);
    

    65 macht hier keinen Sinn
    Kzrt



  • Danke schon mal für alles.
    Habe ein neues Problem. Möchte einen Pause Button einfügen. Habe deshalb eine bool Variable "laeuft" in der Unit1.cpp global deklariert. Wenn ich diese aber in der while Schleife Abfrage wird nicht in die Abfrage gesprungen, totz dass diese auf true gesetzt ist. Hier der Code der Abfrage:

    String Text;
                unsigned long t = time(0) + 12*60, x;
        do {
            if (laeuft == true)
            {
            x = t - time(0);
            //cout << "\r" << (x/60) << ":" << (x%60);
            Text =  IntToStr(x/60) + ":" + IntToStr(x%60);
            Form1->Edit1->Text= Text;
            //Form1->Edit1->Refresh();
            usleep(100000);
            }
        } while (x >= 0);
    


  • Natürlich. Die zeit läuft ja weiter.
    Es bleibt dir nichts anderes übrig als t neu zu setzen wenn lauft auf true geht.


Anmelden zum Antworten