TTimer als globale clock



  • hi

    möchte den TTimer als clock nutzen, um verschiedene funktionen zu timen, ohne die aber alle im OnTimer event aufzulisten, da die zum teil auch privat bleiben sollen.
    geht das? wie?

    hab mal folgendes im OnTimer event

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    	if( Timer1->Enabled )
    		Timer1->Enabled = false;
    	else if( !Timer1->Enabled )
    		Timer1->Enabled = True;
    }
    

    dh er läuft immer 1000ms und dann 1000ms nicht mehr.

    void my_object::on_clock()
    {
        while( Form1->Timer1-> Enabled )
        {
            // tu dies..
        }
    }
    

    wenn ich das abfrage, läuft meine schlaufe eben auch in dem rhytmus, ist aber nach 1s schon durch. will aber jede sekunde nur ein durchlauf.
    nur wie 😕

    würd lieber ne art clocksignal an die objekte schicken
    aber irgendwie raff ichs nicht

    wär für hilfe dankbar



  • Richtig klar wird nicht, was du genau vorhast.
    In deinem Beispiel läuft der Timmer auf jeden Fall nur einmal und dann nie wieder. Denn wenn er disabled ist wird kein OnTimer ausgelöst, in dem er wieder enabled werden könnte.

    Der Timer sollte konstant laufen und im OnTimer lediglich ein Flag hinundherschalten, dieses Flag kannst du dann in deinen Schleifen auswerten.



  • void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    	if( Timer1->Enabled )
    		Timer1->Enabled = false;
    	else if( !Timer1->Enabled )
    		Timer1->Enabled = True;
    }
    

    Hi,
    kann mir einer das zusätzliche if erklären?
    Was kann denn da noch rauskommen? gibt es seit neustem trlse? 😉

    MfG

    Alexander Sulfrian



  • hmtja etwas verwirrt wohl ich bin. 🙄

    was ich eigentlich wollte ist, dass meine funktionen aus der schlaufe jede sekunde einmal abgearbeitet werden.
    die sollen aber nicht vom timer aufgerufen werden, wegen der zugriffsrechte.

    ..hm geht wohl nicht 😞



  • Hi,
    evtl. so:

    void my_object::on_clock()
    {
        while (true) {
            for (int i = 0; i < 10; i++)
            {
                Application->ProcessMessages();
                Sleep(100);
            }
    
            //tu was
        }
    }
    

    *ungetestet da Linux und keinen Builder zur Hand*
    Evtl. noch die while mit ner Bedingung versehen, damit das nich für immer und ewig jede Sekunde ausgeführt wird.

    MfG

    Alexander Sulfrian



  • Was habt ihr mit dieser while-Schlaufe?

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        switch(Timer1->Tag)
        {
            case 0:
                    // tu was...
                break;
            case 1:
                    // tu was zum zweiten...
                break;
            case 2:
                    // tu was zum dritten...
                break;
    
        }
        Timer1->Tag++;
    }
    
    void TForm1::Button1Click()
    {
        Timer1->Intervall = 1000;
        Timer1->Enabled = true;
    }
    


  • 1310-Logik schrieb:

    die sollen aber nicht vom timer aufgerufen werden, wegen der zugriffsrechte.

    Mhh auch wenns ein Designfehler is wünscht er es so...

    MfG

    Alexander Sulfrian



  • [quote="BigNeal"]Was habt ihr mit dieser while-Schlaufe?

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
        switch(Timer1->Tag)
        {
            case 0:
                    // tu was...
                break;
            case 1:
                    // tu was zum zweiten...
                break;
            case 2:
                    // tu was zum dritten...
                break;
    
       }
    
        Timer1->Tag++;
    }
    
    case 213874312:
                    //tu was zum 213 millionsten mal???
    

    wie soll das denn gehn??

    habs jetzt so gelöst

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    	a_manager->cycle();
    }
    

    die manager class hat nen container aller zu verarbeitenden items, wobei die methoden der items trotzdem noch public sein müssen. 👎
    aber das geht wohl nicht anders 😕

    mach ich das eigentlich zu kompliziert? denk halt dass das schöne oop ist oder nich'? effizient is es nich..
    will die form von der rechnerei trennen. dabei muss ich die *form1 als parameter bei der konstruktion des managers übergeben.
    wie macht ihr profis sowas?

    @Alexander Sulfrian
    das mit den windows messages ist noch interessant, wollt am liebsten ne meldung vom timer aufn bus jagen, und die objekte holen sich dann die wieder..
    aber das brächt wohl schon mehr aufwand (multithread?)

    Mhh auch wenns ein Designfehler is wünscht er es so...

    wieso wo ist der fehler?? wünsche es gern richtig zu machen 😞
    bin da noch nicht so bewandt mit ood/oop oder wie auch immer..

    na ich danke mal vorerst,
    weitere ideen nehm ich gern auf



  • 1310-Logik schrieb:

    case 213874312:
                    //tu was zum 213 millionsten mal???
    

    wie soll das denn gehn??

    Der Tag muss natürlich wieder auf 0 gesetzt werden. Hier wohl beim dritten Durchlauf.

    Wo ist denn genau dein Problem? Dass du von außen nicht auf private-Methoden zugreifen kannst? Das wäre nämlich ziemlich logisch.



  • HEZ schrieb:

    Wo ist denn genau dein Problem? Dass du von außen nicht auf private-Methoden zugreifen kannst? Das wäre nämlich ziemlich logisch.

    das ist mir auch klar, dass es nicht geht, aber ich will das eigentlich nicht, wieso weis ich auch nicht..



  • was willst du nicht?
    nach dem Prinzip der oop programmieren?

    du kannst es ja auch so lösen

    while(1)
    {
        Sleep(1000);    // 1 sek pause
        // Tu irgendwas 
    }
    

    😉



  • 1310-Logik schrieb:

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    {
    	if( Timer1->Enabled )
    		Timer1->Enabled = false;
    	else if( !Timer1->Enabled )
    		Timer1->Enabled = True;
    }
    

    // ich würde das so schreiben...

    Timer1->Enabled = !Timer1->Enabled;
    


  • ich würde das so schreiben:

    Timer1->Enabled = false;
    

    irgendwie macht es für mich keinen Sinn, den OnTimer-Event aufzurufen, wenn Timer->Enabled == false ist



  • jaja inzwischen is mir klar, dass die if abfragerei reichlich müll war, die mach ich ja auch nich mehr.

    will oop machen aber wie?
    mein problem:

    ich wollt alle 1000ms einige methoden von objekten verschiedener klassen aufrufen.
    diese methoden will ich aber vor anderen zugriffen schützen. darum nicht public
    die form1 will ich aber auch nicht als friend haben (die stinkt)

    ists völlig blöd was ich will?
    hab ichs prinzip nicht kapiert oder wie?



  • da du so komische ansprüche hast..

    • du fügst ein Objekt von TTimer als Member in deine Klasse ein
    • du stellst die nötigen schnittstellen im public bereich für dein Klassen zur verfügung
    • du zeigst mit dem Funktions-pointer TTimer::OnTimer auf eine Member-Methode deiner Klasse.
    • du erstellst eine Klasse die als friend deklariert ist und den Timer kapselt


  • Sunday schrieb:

    // ich würde das so schreiben...

    Timer1->Enabled = !Timer1->Enabled;

    Warum denn?? Bitte erklär das mal



  • bitte erklärt mir mal wie man das den "richtig" macht, ohne meine komischen ansprüche..
    bin echt nicht sicher was richtig ist, da anfänger..
    hab nur mal gelesen, sowenig wie möglcich public zu machen wär n dogma 😕


Anmelden zum Antworten