Zeitbeschränkung
-
Hi,
wie kann ich denn den Computer dazu bringen, nicht z.B. eine Zahl so schnell wie möglich auszugeben (z.B. bei einer Schleife wo zahlen ausgegeben werden), sondern dass der PC z.B. nur jede Sekunde eine Zahl ausgibt?Wäre sehr dankbar, wenn ihr mir weiter helfen könntet.
-
In Anbetracht der Tatsache die Abfrage für die Zeit dauert keine Zeit würde ich folgendes System vorschlagen:
unsigned long int LoopTime(time(0)); while(Bedingung) { // Code unsigned long int Diesmal(time(0)); Sleep(1000-(Diesmal-LoopTime)); LoopTime = Diesmal; // bzw. time(0) }
Das wird aber doch ungenau - imho auf Sekunden beschränkt. Das bedeutet wenns genauer sein soll musst du auf bessere Zeitgeber umsteigen - siehe dazu am besten in der MSDN.
In deinem Fall würde aber - wenns nicht 100% genau sein soll, auch soetwas reichen:
while(Bedingung) { cout << "Text"; Sleep(990); // 1000ms = 1 Sekunde, 10ms rechnen wir für einen Durchgang ab }
Wird zwar wohl nicht genau sein und gibt Probleme wenn es länger dauert den Text auszugeben da es dann trotzdem wartet. Ist aber bei der Ausgabe von Text hoffentlich nicht der Fall!
MfG SideWinder
-
Wenns mehr Aufwand auch bringt:
Erstelle einen Windowstimer der jede Sekunde eine Funktion aufruft die den Text ausgibt. Diese Funktion öffnest du einfach in einem neuen Thread - der Timer läuft also weiter.
MfG SideWinder
-
So dürfte es auch ganz gut klappen:
... interval=1; //in Sekunden while(...) { start=time(0); ... while(time(0)-start<interval) Sleep(1); //Damit das System auch noch was machen kann }
-
@AJ: Ist aber fast wie mit:
while(!kbhit()) char c (getch());
auf eine Eingabe zu warten...
MfG SideWinder
-
@Side
Ich glaube da täuschst du dich jetzt aber.
Du kannst ja mal versuchen das Sleep(1) wegzulassen. Wenn du das System unbedingt unnötig belasten möchtest.Eine schönere Lösung wäre natürlich, wenn man genau die millisekunden rauskriegen würde, die zwischen Schleifenanfang und -ende liegen und diese dann von 1000 abzieht. Leider kenne ich dazu keine Funktionen
-
Ups dachte, dass Sleep(1) nach der Schleife ist - warum bist du auch zu faul Klammern zu setzen :p;).
Also da time() sowieso nur Sekunden liefert bringts dir wenig 1ms bei Sleep() zu warten - da kannst du gleich mehr einstellen.
MfG SideWinder
-
@Side
Schau dir die Schleife nochmal genauer an. (... steht übrigens für Quellcode, der dazwischen liegt ;))Ich warte einfach nur bis die Sekunde um ist
Wobei mir grad auffällt, dass das zu Fehlern führen könnte. Ich glaub die beste Lösung ist immer noch Sleep(1000) um eine Sekunde zu warten. Vorausgesetzt der Quellcode in der Schleife ist nicht zu Zeitaufwendig, aber das kann man ja im Feldversuch noch etwas abstimmen.PS:
Das mit den Klammern nicht setzen, hab ich mir in der Arbeit angewöhnt, weil mein Chef den Code "übersichtlich" haben wollte. Das er also soviel Quellcode wie möglich auf dem Bildschirm sehen kann.
-
Hier eine Lösung mit API-Funktionen, und eine höhern Auflösung als Sekunden.
LARGE_INTEGER start,end,f; long int value; double frq; QueryPerformanceFrequency(&f); frq=1.00/(double)f.QuadPart*1000.0; QueryPerformanceCounter(&start); while(...) { //............ Mache hier deine Arbeit QueryPerformanceCounter(&end); value=DelayTimeInMilleSek - ((double)(end.QuadPart-start.QuadPart))*frq; start=end; Sleep(value); }
-
Weiß nicht an was das liegt aber bei mir klappt die Sleep Funktion nur mit printf. Ist Sleep mit C++ nicht kompatibel????!??
void main(void)
{
int Ende=0;
while(!Ende)
{
printf("Test");
Sleep(100);if(_kbhit())
Ende=1;
}}
dies klappt -> Test wird nacheinander Ausgegebenvoid main(void)
{
int Ende=0;
while(!Ende)
{
cout<<"Test";
Sleep(100);if(_kbhit())
Ende=1;
}}
Dies klappt nicht??????? An was liegt das?
-
Ich glaube das Problem liegt am Eingabepuffer von cout den printf() nicht hat.
Versuch mal statt deiner cout-Ausgabe diese, bei der am Ende noch geflusht wird:
cout << "Test" << flush; // bzw. endl (flushen + newline) cout << "Test" << endl;
MfG SideWinder
-
Danke! Ja du hast recht. Aber dann war dein Code den du weiter oben geschrieben hast nicht richtig oder?
while(Bedingung) { cout << "Text"; Sleep(990); // 1000ms = 1 Sekunde, 10ms rechnen wir für einen Durchgang ab }
-
Stimmt auch wieder
MfG SideWinder