Sleep() funktioniert nicht



  • Guten Tag,

    ich habe folgendes Problem:
    Ich habe über den Beep-Befehl (#include<windows.h>) ein Programm geschrieben, dass mir die Tetris-Melodie ausgibt.
    Als Variable "takt" kann ich nun einstellen, wie schnell die Melodie abgespielt wird.
    Das ganze sieht so aus:

    #include<iostream>
    using namespace std;
    #include<windows.h>
    
    void main()
    {
    int takt=220;		//takt in ms = 1/8 Ton
    float c2=523.251;		//c''
    float d2=587.330;		//d''
    float e2=622.254;		//e'' um Halbton niedriger
    float f2=698.456;		//f''
    float g2=783.991;		//g''
    float a2=830.609;		//a'' um Halbton niedriger
    float h2=932.328;		//h'' um Halbton niedriger
    float c3=1046.50;		//c'''
    
    Beep(g2,takt*2);		//g''				1. Zeile
    Beep(d2,takt*1);		//d''
    Beep(e2,takt*1);		//e''
    Beep(f2,takt*2);		//f''
    Beep(e2,takt*1);		//e''
    Beep(d2,takt*1);		//d''
    Beep(c2,takt*2);		//c''
    Beep(c2,takt*1);		//c''
    Beep(e2,takt*1);		//e''
    Beep(g2,takt*2);		//g''
    Beep(f2,takt*1);		//f''
    Beep(e2,takt*1);		//e''
    Beep(d2,takt*3);		//d''	(2 Toene)
    Beep(e2,takt*1);		//e''
    Beep(f2,takt*2);		//f''
    Beep(g2,takt*2);		//g''
    Beep(e2,takt*2);		//e''
    Beep(c2,takt*2);		//c''
    Beep(c2,takt*2);		//c''
    Sleep(takt*2);		//Pause
    Sleep(takt*1);		//Pause			2. Zeile
    Beep(f2,takt*2);		//f''	(2 Toene)
    Beep(a2,takt*1);		//a''
    Beep(c3,takt*2);		//c'''
    Beep(h2,takt*1);		//h''
    Beep(a2,takt*1);		//a''
    Beep(g2,takt*3);		//g''	(2 Toene)
    Beep(e2,takt*1);		//e''
    Beep(g2,takt*2);		//g''
    Beep(f2,takt*1);		//f''
    Beep(e2,takt*1);		//e''
    Beep(d2,takt*2);		//d''
    Beep(d2,takt*1);		//d''
    Beep(e2,takt*1);		//e''
    Beep(f2,takt*2);		//f''
    Beep(g2,takt*2);		//g''
    Beep(e2,takt*2);		//e''
    Beep(c2,takt*2);		//c''
    Beep(c2,takt*2);		//c''
    Sleep(takt*2);			//Pause
    }
    

    Ich habe nun vergeblich versucht bei der Pause (2. Zeile) 220ms bzw. 440ms einzustellen, aber es ist nicht möglich.
    Geb ich jedoch 1000ms (1 Sekunde^^) ein, dann nimmt er den Wert an, und wartet 1s.
    Ist der Wert jedoch kleiner 1s, dann überspringt er einfach den Sleep-Befehl und bringt direkt den nächsten Beep-Befehl.

    Hoffentlich kann mir einer weiterhelfen 🙂

    Edit: Benutzt wird "Microsoft Visual C++ 2008 Express Edition"

    MfG



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • If dwMilliseconds is less than the resolution of the system clock, the thread may sleep for less than the specified length of time. If dwMilliseconds is greater than one tick but less than two, the wait can be anywhere between one and two ticks, and so on. To increase the accuracy of the sleep interval, call the timeGetDevCaps function to determine the supported minimum timer resolution and the timeBeginPeriod function to set the timer resolution to its minimum

    also:

    timeBeginPeriod(1);
    //..dein code...
    
    timeEndPeriod(1);
    


  • danke livinskull

    könntest du bitte die änderung in mein programm einfügen?
    ich blick das nicht so 100%ig...



  • Hat er doch quasi schon. Lies dir seinen Post noch mal genau durch.



  • void main()
    {
    timeBeginPeriod(1);
    
    ...mein Code...
    
    timeEndPeriod(1);
    }
    

    Beim Kompilieren bekomme ich eine Fehlermeldung



  • plusplusUser schrieb:

    void main()
    {
    timeBeginPeriod(1);
    
    ...mein Code...
    
    timeEndPeriod(1);
    }
    

    Beim Kompilieren bekomme ich eine Fehlermeldung

    Sicher beim Kompilieren und nicht etwa beim Linken?
    btw.: 'bekomme eine Fehlermeldung' ist ein bisschen mickrig. Wieviel willst Du, damit Du uns die Fehlermeldung verrätst?



  • 1>tetris.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeEndPeriod@4" in Funktion "_main".
    1>tetris.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeBeginPeriod@4" in Funktion "_main".

    ich hab mich vertan. es ist nicht beim kompilieren sondern wenn ich bei Microsoft Visual C++ 2008 Express Edition F7 drücke
    ->
    Debug.RunToCursor
    F7
    Im Unterbrechungsmodus wird die Codeausführung an der aktuellen Anweisung wieder aufgenommen und bis zur ausgewählten Anweisung ausgeführt. Auf dem Indikatorrahmen wird der Indikator für die momentan ausgeführte Zeile angezeigt.

    Da sollte das rauskommen:
    ========== Erstellen: 1 erfolgreich, Fehler bei 0, 0 aktuell, 0 übersprungen ==========

    und mit den oben geposteten Befehlen habe ich:
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



  • plusplusUser schrieb:

    1>tetris.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeEndPeriod@4" in Funktion "_main".
    1>tetris.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeBeginPeriod@4" in Funktion "_main".

    Also ein Linker Fehler. Du musst die entsprechende Bibliothek mit in Dein Projekt aufnehmen: Winmm.lib



  • wie wird diese eingebunden? bestimmt nich so wie sie da steht oder?

    Winmm.lib

    -> #include<Winmm.lib> ?

    Wir machen C++ nur ein Jahr und das 4 Schulstunden pro Woche, da haben wir leider kein so umfangreiches Wissen...:(



  • Bei solchen Schwierigkeiten nicht raten und rätseln, sondern erst mal in die Doku schauen.

    http://msdn.microsoft.com/en-us/library/windows/desktop/dd757624(v=vs.85).aspx

    Steht doch alles da. windows.h inkludieren, Winmm.lib linken => fertig! 🙂



  • Also jetzt bin ich total verwirrt.
    Ich dachte Winmm.lib ist schon die Bibliothek?
    windows.h steht ja schon drin (siehe Programmcode) und was hat das mit dem "linken" auf sich?



  • plusplusUser schrieb:

    wie wird diese eingebunden? bestimmt nich so wie sie da steht oder?

    Winmm.lib

    -> #include<Winmm.lib> ?

    Wir machen C++ nur ein Jahr und das 4 Schulstunden pro Woche, da haben wir leider kein so umfangreiches Wissen...:(

    Zum Beispiel so:

    #pragma comment(lib, "Winmm.lib")
    

    (oder auch in den Projektsettings unter Linker)

    Je weniger Wissen man hat, desto wichtiger ist es zu lernen, wie man sich Wissen aneignen kann. 💡

    Mit Rumprobieren wirst du beim Programmieren nicht weit kommen. Du musst dir angewöhnen, dir die benötigten Infos aus dem Internet zu besorgen.



  • Je weniger Wissen man hat, desto wichtiger ist es zu lernen, wie man sich Wissen aneignen kann. 💡

    Mit Rumprobieren wirst du beim Programmieren nicht weit kommen. Du musst dir angewöhnen, dir die benötigten Infos aus dem Internet zu besorgen.

    Deswegen frag ich ja nach. Ich habe für den Fehler mit dem Sleep()-Befehl schon mehrfach und auch lange gegooglt und leider nichts gefunden.
    DAS Programm brauch ich auch nicht für die Schule sondern habe ich für mich erstellt, weil mich das interessiert was möglich ist und wie ich es umsetzen kann. Desweiteren frag ich auch beim Lehrer immer weiter, als der Stoff eigentlich geht, denn ich will zu einem Thema am besten alles wissen, auch wenn es für Schulaufgaben oder die Prüfung irrelevant ist.

    Muss mich ja auch mal rechtfertigen 😉

    PS: ich hätt noch ne kleine Zusammenfassung, die ist auch nach Vorlage beim Lehrer sogar für Schulaufgaben und die Prüfung zugelassen. Bei interesse könnt ich die mal irgendwo posten oder hochladen falls es für andere eine Hilfe wäre, die mit Microsoft Visual C++ 2008 Express Edition programmieren.



  • _matze schrieb:

    Du musst dir angewöhnen, dir die benötigten Infos aus dem Internet zu besorgen.

    Dazu gehört aber doch auch das Stellen von Fragen in einem passenden Forum, oder?! 😉



  • Belli schrieb:

    _matze schrieb:

    Du musst dir angewöhnen, dir die benötigten Infos aus dem Internet zu besorgen.

    Dazu gehört aber doch auch das Stellen von Fragen in einem passenden Forum, oder?! 😉

    Hehe, klar. Nicht falsch verstehen, ich will niemanden vergraulen oder so. Ich helfe ja auch gerne. Aber es muss auch erlaubt (und eigentlich sogar gewünscht) sein, ihm gleichzeitig alternative Wege aufzuzeigen, um schneller an die nötigen Infos zu kommen (z.B. Doku). 🙂



  • Ich habs in

    C++ (auch C++0x und C++11) FAQ/Archiv

    gepostet, ich weiß nichtmal was das WinAPI bedeutet^^

    Aber ich bin gewillt dazu zu lernen, auch wenn ich es für die Schule zumindest oder vllt. auch später bei der Arbeit wahrscheinlich nicht mehr brauchen werde.

    Mit SuFus und google steh ich irgendwie auf Kriegsfuss, wie gesagt, ich habe meinen Lehrer zu dem Problem gefragt, ca. 3h in googln gesteck und bin nicht weiter gekommen. Dazu kommt noch das dies von Software zu Software teilweise unterschiedlich im Syntax ist.



  • _matze schrieb:

    Aber es muss auch erlaubt (und eigentlich sogar gewünscht) sein, ihm gleichzeitig alternative Wege aufzuzeigen, um schneller an die nötigen Infos zu kommen (z.B. Doku). 🙂

    Auf jeden Fall!
    Aber ich kann mich noch gut daran erinnern, dass ich in den Anfängen froh war, wenn auf Knopfdruck oder aber auf 'cl prog.cpp' eine exe-Datei herauskam. Das dabei neben einem Compiler noch ein Linker beteiligt war, war mir (ziemlich lange, glaube ich) gar nicht bewusst. Später kam dann das Phänomen, dass sich manche Programme für Windows ohne zusätzliche Bibliotheken erstellen lassen, bei Benutzung entsprechender Funktionen aber gibts plötzlich Linkerfehler ... ich find das schon alles nicht so einfach für einen Programmieranfänger. Und mit der MSDN, so man denn dann erst mal drauf gestoßen ist, ist das auch nicht immer so einfach, wenn man nicht gerade genau nach einer bestimmten vom Namen her bekannten Funktion sucht.



  • plusplusUser schrieb:

    Ich habs in

    C++ (auch C++0x und C++11) FAQ/Archiv

    gepostet, ich weiß nichtmal was das WinAPI bedeutet^^

    Aber ich bin gewillt dazu zu lernen, auch wenn ich es für die Schule zumindest oder vllt. auch später bei der Arbeit wahrscheinlich nicht mehr brauchen werde.

    Mit SuFus und google steh ich irgendwie auf Kriegsfuss, wie gesagt, ich habe meinen Lehrer zu dem Problem gefragt, ca. 3h in googln gesteck und bin nicht weiter gekommen. Dazu kommt noch das dies von Software zu Software teilweise unterschiedlich im Syntax ist.

    Nun, wie du die lib da rein kriegst, hatte ich ja schon gepostet. Funktioniert das nun bei dir? Oder was ist der aktuelle Status? Gibt's noch Fehlermeldungen?



  • Belli schrieb:

    _matze schrieb:

    Aber es muss auch erlaubt (und eigentlich sogar gewünscht) sein, ihm gleichzeitig alternative Wege aufzuzeigen, um schneller an die nötigen Infos zu kommen (z.B. Doku). 🙂

    Auf jeden Fall!
    Aber ich kann mich noch gut daran erinnern, dass ich in den Anfängen froh war, wenn auf Knopfdruck oder aber auf 'cl prog.cpp' eine exe-Datei herauskam. Das dabei neben einem Compiler noch ein Linker beteiligt war, war mir (ziemlich lange, glaube ich) gar nicht bewusst. Später kam dann das Phänomen, dass sich manche Programme für Windows ohne zusätzliche Bibliotheken erstellen lassen, bei Benutzung entsprechender Funktionen aber gibts plötzlich Linkerfehler ... ich find das schon alles nicht so einfach für einen Programmieranfänger. Und mit der MSDN, so man denn dann erst mal drauf gestoßen ist, ist das auch nicht immer so einfach, wenn man nicht gerade genau nach einer bestimmten vom Namen her bekannten Funktion sucht.

    Da ist schon was Wahres dran. Die MSDN hilft zwar wenig beim Suchen bestimmter, namentlich unbekannter Funktionalität, wie du schon sagst, aber sie hilft dann beim korrekten Anwenden der gewünschten Funktion. Und wenn man einmal weiß, wie man einen Header und eine lib einbindet, dann ist die MSDN in fast allen Fällen völlig ausreichend, um zu einem Ergebnis zu kommen. Daher finde ich es gut, Anfänger direkt mal darauf zu stoßen, dass es sowas wie eine Doku gibt und sich manche Infos nun mal viel flotter daraus ziehen lassen als aus dem Forum hier. Aber ich gebe zu, dass mich die MSDN anfangs auch eher verwirrt hat. 😉

    So, erklärst du ihm jetzt, was der Linker macht, oder ich? 😃


Anmelden zum Antworten