C++ Schleife eine Sekunde lang.

#4138937
Lesenswert?

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 #4138971
Lesenswert?

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 #4138977
Lesenswert?

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 #4139008
Lesenswert?

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)
#4139021
Lesenswert?

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.
#4139023
Lesenswert?

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 #4139239
Lesenswert?

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
}
#4139705
Lesenswert?

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 #4139709
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren