Frage zu einer Delay Funktion



  • Hallo ich bin gerade im FAQ auf diesen Beitrag gestoßen.

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39270.html

    Dort steht nun folgende Funktion

    //funktion 1
    void delay(int D) // Dauer in Millisekunden 
    { 
      for (int i = 0; i < D; i += 50) 
      { 
        Sleep(50); 
        Application->ProcessMessages(); 
      } 
    }
    

    Irgendwie ist mir nicht klar wofür die Schleife ist wäre den nicht Funktion 1 das selbe so wie Funktion 2 ?

    //funktion 2
    void delay() // Dauer in Millisekunden
    {
    
        Sleep(2000);
        Application->ProcessMessages();
    
    }
    


  • Nein. Funktion 2 ist nicht parametrisierbar und beschränkt sich auf feste 2000ms, bei Funktion 1 kannst du per Argument die Dauer des Delays bestimmen.



  • ah okay danke.



  • [Lehrerfrage]Wie oft wird denn jeweils Application->ProcessMessages() aufgerufen ?[/Lehrerfrage] 😃

    ... deswegen ist Version 1 besser. (Die Parametrisierbarkeit wäre ja schnell nachgebaut)

    Gruß,

    Simon2.



  • Noch schlimmer. In der zweiten Funktion werden die Messages nur alle 2 Sekunden verarbeitet, während dies in der ersten alle 50 Millisekunden geschieht. Jenachdem wie teuer die Funktion ist, verschiebt sich natürlich das eigentliche Ergebnis.

    Also Delay1(2000) ist nicht das gleiche wie Delay2();



  • Irgendwie sind beide Funktionen Müll. Falls es sich hier um ein Toolkit handelt, das Events verarbeiten muss, dann gibt es sicherlich eine Lösung genau die gewünschte Zeit zu warten und gleichzeitig ohne Polling alle Events zu verarbeiten. Ansonsten ist das Toolkit Müll.

    In Qt zum Beispiel würde man das mit QTimer lösen.



  • Bei dieser Funktion braucht das Programm 3 Sekunden bis es sich schließt:
    Aber man hat doch 2000 Millisekunden eingeben

    #include <vcl>
    #include <windows>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    void delay(int D);
    
    delay(2000);
    
    return 0;
    }
    
    void delay(int D) // Dauer in Millisekunden 
    { 
      for (int i = 0; i < D; i += 50) 
      { 
        Sleep(50); 
        Application->ProcessMessages(); 
      } 
    }
    

    Wenn ich es so mache dann schließt es sich ja 2 Sekunden:

    #include <vcl>
    #include <windows>
    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    void delay(int D);
    
    delay(2000);
    
    return 0;
    }
    
    void delay(int D) // Dauer in Millisekunden
    {
    
        Sleep(D);
        Application->ProcessMessages();
    
    }
    

    Wofür steht in der ersten Funktion die Schleife das Programm soll sich doch einfach nur noch 2 Sekunden beenden.



  • Nimm dir einen Zettel und einen Bleistift.

    Wenn du erstmal ein paar Minuten versucht hast es zu verstehen, dann verstehst du es auch. Aber probieren musst du schon selber



  • Ich glaub jetzt hab ichs verstanden ich hab das jetzt mal versucht so zu verstehen

    #include <iostream>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
    
    int D = 2000;
    
      for (int i = 0; i < D; i += 50)
      { 
       cout<<"I : "<<i<<"\n";
    
      Sleep(50);
      }
    
      return 0;
    
    }
    

    Der Zählt ja jetzt die Schleife immer in 50 er Schritten Hoch also 50,100,150...

    Bis der bei 2000 ist und zwischen dem Hochzählen ist immer eine Verzögerung von 50 Millisekunden.

    Also immer 50 (50milisec verzögerung) 100 (50milisec verzögerung) 150....

    Und das alles dauert bei mir 3 Sekunden.



  • Du hast halt min. 2 Sekunden Sleep (wie gewollt) und max. 1 Sekunde "Overhead". Sei es die Schleife an sich oder vorher das ProcessMessages.

    Mit so einem statischen Ansatz ohne die tatsächliche Zeit zu berücksichtigen, bekommst du eh kein genaues Ergebnis. Wobei du das eh gar nicht bekommen kannst, da es kein Echtzeitbetriebssystem ist. Gehe ich zumindest mal stark von aus. 😉



  • Die Zeitauflösung liegt bei Windows bei 15-16 ms, jedes Sleep(50) dauert daher 62-63 ms.



  • Nanyuki schrieb:

    Die Zeitauflösung liegt bei Windows bei 15-16 ms, jedes Sleep(50) dauert daher 62-63 ms.

    Bist du dir sicher? Das wäre ja extrem ungenau...



  • Nexus schrieb:

    Nanyuki schrieb:

    Die Zeitauflösung liegt bei Windows bei 15-16 ms, jedes Sleep(50) dauert daher 62-63 ms.

    Bist du dir sicher? Das wäre ja extrem ungenau...

    Die Auflösung kann ich bestätigen. Sie kann mit einer API Funktion (deren Namen mir nicht einfällt) abgefragt werden.

    Simon



  • Ist ja auch nur ein 08/15 Betriebssystem für Anwender und nicht für Wissenschaftler etc. 😉



  • Eine Frage noch ^^

    Was meinst du mit dem Overhead Fellhuhn ?



  • Zeit die nicht für die eigentliche Aufgabe (das Warten) draufgeht.



  • also ich hab auch schon sowas wie minimal 10msec gehört. Drunter keinesfalls.




Anmelden zum Antworten