Forum: PC-Programmierung C++ Schleife eine Sekunde lang.


von Dani (Gast)


Lesenswert?

Wie schaffe ich es in C++ (PC) eine Schleife eine Sekunde lang 
auszuführen?
Z.B. so
1
while(/*1 skeunde lang*/)
2
{
3
}
Das würde dann nur eine Sekunde lang Rechenleistung verbrennen, ich 
würde dann etwas Sinnvolles in die Schleife setzten.

von Peter II (Gast)


Lesenswert?

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.

von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Ist es mit .net ok? Oder muss es ohne sein?

in .net gibt's eine stopwatch in system.diagnostics

: Bearbeitet durch User
von Torsten C. (torsten_c) Benutzerseite


Lesenswert?

Peter II schrieb:
> Wenn man eine Sekunde warten will, gibt es dafür auch Timer.

es gibt viel. in einem, backgroundworker könnte es ohne timer sinn 
machen.

sorry, hab nur eine hand frei.

von (prx) A. K. (prx)


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.

von Dummy (Gast)


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.

von Peter II (Gast)


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.

von Dummy (Gast)


Lesenswert?

Peter II schrieb:

> clock_gettime mit CLOCK_MONOTONIC ist das sinnvoller.

Und auf Windows oder Mehrprozessorsystemen fällt man damit dann auf die 
Nase.

Dann kann ich mich direkt mit getticks() aus der unistd.h rumärgern.

von Peter II (Gast)


Lesenswert?

Dummy schrieb:
> Dann kann ich mich direkt mit getticks() aus der unistd.h rumärgern.

nein, dafür gibt es unter Windows.

QueryPerformanceCounter

von Dummy (Gast)


Lesenswert?

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.

von Peter II (Gast)


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)

von Peter II (Gast)


Lesenswert?


von (prx) A. K. (prx)


Lesenswert?

Ob bei einer Sekunde wirklich PerfCtr bemüht werden müssen?

von Peter II (Gast)


Lesenswert?

A. K. schrieb:
> Ob bei einer Sekunde wirklich PerfCtr bemüht werden müssen?

besseren vorschlag?

PerfCtr hat extrem wenig Overhead, was spricht dagegen?

von Dummy (Gast)


Lesenswert?

Ok, werde ich mal testen. Danke.

Aber eine allgemeine ANSI-C Lösung für das Problem gibt es nicht, oder?

von Peter II (Gast)


Lesenswert?

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

von (prx) A. K. (prx)


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.

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
von Hans-Georg L. (h-g-l)


Lesenswert?

wenn du unter Windows 1 sec warten willst benutze einfach:

Sleep(1000);


https://msdn.microsoft.com/en-us/library/windows/desktop/ms686298%28v=vs.85%29.aspx

von Peter II (Gast)


Lesenswert?

Hans-Georg Lehnard schrieb:
> wenn du unter Windows 1 sec warten willst benutze einfach:

das will er aber nicht.

von Caligulaminus (Gast)


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
}

von R. Rebentrost (Gast)


Lesenswert?

Nur mal sicherheitshalber, da über den Kontext nichts gesagt wurde: 
Bitte nicht in einem UI-Thread so etwas veranstalten.

von Hans-Georg L. (h-g-l)


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.

von Dani (Gast)


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 :-)

von Robert L. (lrlr)


Lesenswert?

Hans-Georg Lehnard schrieb:
> Der OP will eine while schleife und überlegt wie er in dieser Zeit den
> Prozessor beschäftigen kann.

laut 1. Post will er das nicht, sondern eine Sekunden lang "etwas 
sinnvolles machen" (und DAS mach sleep(1000) sicher nicht)

von Rolf M. (rmagnus)


Lesenswert?

A. K. schrieb:
> Peter II schrieb:
> PS: Update zu den 40 Jahren: Heute müsste man "volatile" hinzufügen. War
> damals weder existent noch nötig.

Damals waren die Optimizer eben noch so schlecht, daß es keinen 
Unterschied gemacht hat.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.