Sleep(); - Alternative
-
Wollt mal wissen, ob- und was es da gibt,
da bei Sleep(); ja alles eingefroren wird.
Vieleicht mit <time.h>???Danke!
Canon
-
Was soll das heissen, "alles eingefroren"? Es wird ja nur in dem Thread, in dem Sleep aufgerufen wurde, gewartet. Alles andere läuft weiter. Sleep ist übrigens keine Standardfunktion. Was willst du denn genau machen?
-
Ich will eine bewegung simulieren, indem ein bild nach einer bestimmten
zeit ein stück verschoben wird. Um diese zeit zu simulieren viel mir nur
Sleep(x); ein. Allerdings sollen die anderen prozesse, z.B. das bewegen
einer Figur immernoch ausgeführt werden können. Bei Sleep wird allerdings alles
angehalten. Ich dachte mir jezt, das man dafür auf die systemuhr zurückgreifen
könnte, und z.B. x seunden nach starten des programmes das Bild um 1 verschoben
wird, in der nächten wieder, usw. ich weiß allerdings nicht wie ich das anstellen könnte.
-
Das Schlüsselwort für dich heisst Timer. Such mal hier oder im Grafikforum, da gabs schon 'ne ganze Menge Beiträge dazu.
-
Ich hab jezt schon sau lange gesucht, aber nix gefunden, was ich gebrauchen
konnte. Hast du schonmal sowas gemacht, und weißt du wie das geht???Danke für deine Hilfe!
-
du hast eine single-threaded windoof-anwendung?
dann: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/timers/timerreference/timerfunctions/settimer.asp
-
net schrieb:
du hast eine single-threaded windoof-anwendung?
Nee, hat er mit Sicherheit nicht. Da er von Sleep() redete, vermute ich, er hat 'ne Windows Anwendung.
Canon schrieb:
Ich hab jezt schon sau lange gesucht, aber nix gefunden, was ich gebrauchen konnte.
Glaub ich nicht.
http://www.c-plusplus.net/forum/viewtopic.php?t=82977&postdays=0&postorder=asc&highlight=timer&start=40 hier findest du zB eine Timer Klasse
wenn du dich als fortgeschritten siehst, kannst du dir auch mal boost::timer angucken
oder du schreibst dir eigene Timer Funktionen/Klasse (für hochauflösende Sachen schau dir mal die Performance Counter anQueryPerformanceCounter)
Der grundlegende Ablauf kann dann ungefähr so aussehen:
1. Starte Timer mit gewünschter Dauer
2. Timer abgelaufen? ja3., nein
4.
3. bewege Bild1.
4. verarbeite Timer unabhängige Daten2.
-
groovemaster schrieb:
net schrieb:
du hast eine single-threaded windoof-anwendung?
Nee, hat er mit Sicherheit nicht. Da er von Sleep() redete, vermute ich, er hat 'ne Windows Anwendung.
Richtig
Groovemaster schrieb:
Canon schrieb:
Ich hab jezt schon sau lange gesucht, aber nix gefunden, was ich gebrauchen konnte.
Glaub ich nicht.
is aber so
groovemaster schrieb:
wenn du dich als fortgeschritten siehst, kannst du dir auch mal boost::timer angucken.
Ne, tue ich nicht.
groovemaster schrieb:
oder du schreibst dir eigene Timer Funktionen/Klasse (für hochauflösende Sachen schau dir mal die Performance Counter an
QueryPerformanceCounter)
was meinst du, was ich schon die ganze zeit versuche?
groovemaster schrieb:
Der grundlegende Ablauf kann dann ungefähr so aussehen:
1. Starte Timer mit gewünschter DauerWürd ich gerne, aber ich weiß nicht wie
groovemaster schrieb:
2. Timer abgelaufen? ja
3., nein
4.
3. bewege Bild1.
4. verarbeite Timer unabhängige Daten2.
dazu müste man erstmal
1 kennen
ich muss nur wissen, wie man eine simple Stoppuhr startet bzw. stopt.
Dieser:http://www.c-plusplus.net/forum/viewtopic.php?t=82977&postdays=0&postorder=asc&highlight=timer&start=40
Link hat mir auch leider leiderauch nix gebraucht, weil dort solche
einfachen sachen schon als bekannt verausgesezt werden.
Könntest du nicht einfach bitte mal posten wie das geht???*Danke*!
-
hier mal ein ganz simpler timer als pseudocode um einfach mal ein beispiel zu geben wie sowas funktioniert:
class timer{ private: unsigned int i; public: void start(){ i=gettime(); } bool timeElapsed(int seconds){ return gettime()>=i+seconds; } } //in der main timer time; time.start(); while(true){ if(time.timeElapsed(1){ movePicture(); time.start();//damit das bild nach dem ersten bewegen nicht in jedem weiteren Frame bewegt wird } //ganz normal weiterarbeiten }
schlagt mich nicht wegen der klasse, hatte keine lust creativ zu sein^^
-
otze schrieb:
schlagt mich nicht wegen der klasse, hatte keine lust creativ zu sein^^
Nicht wegen der Klasse, sondern wegen der Anwendung. Sonst nimmt sich ja jemand ein Beispiel daran und implementiert ein solches Polling.
-
@Canon
Ob du eine Stoppuhr oder einen Timer benutzt, ist letztendlich egal. Ich poste einfach mal meine Stoppuhr, vielleicht hilft die dir ja mehr.// .cpp class chronometer { public: typedef long long duration_type; private: static const duration_type frequency_; static duration_type query_frequency() { LARGE_INTEGER f; QueryPerformanceFrequency(&f); return f.QuadPart; } static duration_type frequency() { return frequency_; } public: static duration_type time_stamp() { LARGE_INTEGER c; QueryPerformanceCounter(&c); return c.QuadPart; } private: duration_type start_; duration_type end_; bool active_; public: void reset() { if (!active_) start_ = end_; else start_ = time_stamp(); } void start() { if (!active_) { start_ += time_stamp() - end_; active_ = true; } } void stop() { if (active_) { end_ = time_stamp(); active_ = false; } } duration_type elapsed_milliseconds() const { duration_type tmp; if (!active_) tmp = end_ - start_; else tmp = time_stamp() - start_; return tmp * 1000 / frequency(); } chronometer() : start_(0) , end_(0) , active_(false) { } ~chronometer() { } }; // .h const chronometer::duration_type chronometer::frequency_ = chronometer::query_frequency();
Die Klasse ist eigentlich etwas komplexer, ich hab sie nur auf's wesentliche gekürzt. Solltest du also Fehler entdecken, ruhig nachfragen. Wenn du die Zeit für zB Sekunden brauchst, solte es auch kein Problem sein, eine entsprechende Funktion einzubauen.
Aufgerufen wird das ganze dann wie folgt:chronometer cm; cm.start(); // Stoppuhr wurde gestartet //... cm.elapsed_milliseconds(); // bisher abgelaufene Millisekunden abfragen (Stoppuhr laeuft weiter) //... cm.stop(); // Stoppuhr wurde angehalten //... cm.elapsed_milliseconds(); // bis zum Stop abgelaufene Millisekunden abfragen //... cm.reset(); // Stoppuhr wurde auf 0 zurückgesetzt
Man sollte noch erwähnen, dass die QueryPerformance...-Funktionen einen Rückgabewert liefern, der angibt, ob das System überhaupt über solche Counter verfügt. Willst du also für das Fehlen solcher Counter gewappnet sein, dann würde ich empfehlen eine Funktion zu schreiben, die das abfragt und einmalig zu Beginn des Programms aufgerufen wird. Afaik sollte diesbezüglich bei modernen Rechnen aber keine Probleme auftreten. Höchstens bei sehr alten Rechnern (486er & co) ist damit zu rechnen.