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.
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.
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.
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.
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.
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.
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)
A. K. schrieb:> Ob bei einer Sekunde wirklich PerfCtr bemüht werden müssen?
besseren vorschlag?
PerfCtr hat extrem wenig Overhead, was spricht dagegen?
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.
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.
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)
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.