C++ Schleife eine Sekunde lang.

Gast
Dani schrieb:
> Wie schaffe ich es in C++ (PC) eine Schleife eine Sekunde lang
> auszuführen?

in dem man z.b. die Systemzeit abfragt und schaut wann 1 sekunde rum 
ist.

aber wozu das ganze? Wenn man eine Sekunde warten will, gibt es dafür 
auch Timer.
Dani schrieb:
> Wie schaffe ich es in C++ (PC) eine Schleife eine Sekunde lang
> auszuführen?

So gefragt macht man das sinnvollerweise nicht. Man bittet das 
Betriebssystem, eine Sekunde zu verbraten.

> Das würde dann nur eine Sekunde lang Rechenleistung verbrennen, ich
> würde dann etwas Sinnvolles in die Schleife setzten.

Alle Betriebssysteme jenseits DOS haben Methoden, dem Prozess nach einer 
Sekunde Bescheid zu geben. Die Schleife muss also nur dieses Ereignis 
abfragen.

Aber auch das ergibt nur Sinn, wenn in der Schleife nicht nur Zeit 
totgeschlagen wird, sondern Nützliches erledigt wird.
Gast
Wieder mal viel Laberei und wenig Greifbares hier im Forum...

Aus dem Rückenmark:
1
#include <ctime>
2
 
3
clock_t startzeit = clock();
4

5
while ( ((double)(clock() - startzeit))/CLOCKS_PER_SEC < 1){
6
//machwas
7
}

Wie sinnvoll das ist und ob threads besser sind, sei einfach mal 
dahingestellt.
Gast
Dummy schrieb:
> Wieder mal viel Laberei und wenig Greifbares hier im Forum...

naja, ob dein Beitrag sinnvoller ist darf bezweifelt werden:

Clock program
Returns the processor time consumed by the program.

Damit kann man bestimmt keine sinnvolle Sekunde warten.

clock_gettime mit CLOCK_MONOTONIC ist das sinnvoller.
Gast
Peter II schrieb:
> nein, dafür gibt es unter Windows.
>
> QueryPerformanceCounter

Ist die Funktion mittlerweile brauchbar?

Bislang hab ich da timeGetTime() benutzt weil QueryPerformanceCounter() 
durch verschiedene CPU-Energiesparmodi und Multicore Systeme 
durcheinander kam.
Gast
Dummy schrieb:
> Ist die Funktion mittlerweile brauchbar?
ja, schon lange
>
> Bislang hab ich da timeGetTime() benutzt weil QueryPerformanceCounter()
> durch verschiedene CPU-Energiesparmodi und Multicore Systeme
> durcheinander kam.

es gab nur Probleme auf AMD Systemen. Dafür gab es dann von AMD ein tool 
womit man es umgehen konnte.

Damals war das Problem da jeder Kern seinen eignen Counter hatte, wenn 
der Task von einen Kern auf den nächsten verschoben wurde konnte man 
meist eine kleine Überraschung erleben.

Konnte man aber auch leicht verhindern, in dem man die Funktion nur auf 
einen Kern ausgeführt hat. (SetThreadAffinityMask)
Gast
Dummy schrieb:
> Ok, werde ich mal testen. Danke.
>
> Aber eine allgemeine ANSI-C Lösung für das Problem gibt es nicht, oder?

da man so etwas kaum braucht solltest du etwas mehr über den Problem 
sagen. Eventuell gibt es ja dafür dann ein ANSI-C Lösung
Dummy schrieb:
> Wieder mal viel Laberei und wenig Greifbares hier im Forum...

Jau. Weil recht wenig Greifbares in Frage war.

> Aus dem Rückenmark:

Wenn man nicht aufpasst, dann wird der Prozessor dabei allerdings fast 
die gesamte Rechenzeit unproduktiv im Kernel API verbraten.

> Wie sinnvoll das ist und ob threads besser sind, sei einfach mal
> dahingestellt.

Gibt recht viele Möglichkeiten. Eine 40 Jahre alte heute noch 
funktionierende Version liefe über SIGALRM.
Peter II schrieb:
> PerfCtr hat extrem wenig Overhead, was spricht dagegen?

Ein Flag zu testen hat noch wesentlich weniger Overhead. Im Grunde ist 
es das gleiche Verfahren wie es auch bei Mikrocontrollern häufig 
verwendet wird, also via Timer-Interrupt: Mit alarm() den Timer starten, 
mit signal/Nachfahren den SIGALRM Interrupt einfangen und darin Flag 
setzen.

PS: Update zu den 40 Jahren: Heute müsste man "volatile" hinzufügen. War 
damals weder existent noch nötig.
Gast
Da wir ja über C++ reden, darf ich C++11 annehmen?
Dann z.B. so:
1
#include <chrono>
2

3
int main()
4
{
5
  std::chrono::high_resolution_clock hrc;
6
  auto start = hrc.now();
7
  while(std::chrono::duration_cast<std::chrono::milliseconds>(hrc.now() - start).count() < 1000)
8
  {
9
    // schaffe... schaffe...
10
  }
11
}
Peter II schrieb:
> Hans-Georg Lehnard schrieb:
>> wenn du unter Windows 1 sec warten willst benutze einfach:
>
> das will er aber nicht.

Der OP will eine while schleife und überlegt wie er in dieser Zeit den 
Prozessor beschäftigen kann.

Genau das macht Sleep(1000);
Das ist ein Kernel Aufruf der die while schleife, die Beschäftigung des 
Prozessors und die Timerabfrage so nebenbei mit erledigt. Und das ist 
bei einem Multitasking OS wesendlich effektiver.
Gast
Caligulaminus schrieb:
> Da wir ja über C++ reden, darf ich C++11 annehmen?
Klar
> Dann z.B. so:
>
1
 >
2
> #include <chrono>
3
> 
4
> int main()
5
> {
6
>   std::chrono::high_resolution_clock hrc;
7
>   auto start = hrc.now();
8
>   while(std::chrono::duration_cast<std::chrono::milliseconds>(hrc.now() 
9
> - start).count() < 1000)
10
>   {
11
>     // schaffe... schaffe...
12
>   }
13
> }
14
>
Genau danach hab ich gesucht, danke :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.