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.
|
Forum: PC-Programmierung C++ Schleife eine Sekunde lang.Wie schaffe ich es in C++ (PC) eine Schleife eine Sekunde lang auszuführen? Z.B. so
Das würde dann nur eine Sekunde lang Rechenleistung verbrennen, ich würde dann etwas Sinnvolles in die Schleife setzten. 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. Ist es mit .net ok? Oder muss es ohne sein? in .net gibt's eine stopwatch in system.diagnostics :
Bearbeitet durch User
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. Wieder mal viel Laberei und wenig Greifbares hier im Forum... Aus dem Rückenmark:
Wie sinnvoll das ist und ob threads besser sind, sei einfach mal dahingestellt. 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. Dummy schrieb: > Dann kann ich mich direkt mit getticks() aus der unistd.h rumärgern. nein, dafür gibt es unter Windows. QueryPerformanceCounter 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) Hier steht eigentlich alles dazu da: https://msdn.microsoft.com/en-us/library/windows/desktop/dn553408(v=vs.85).aspx A. K. schrieb: > Ob bei einer Sekunde wirklich PerfCtr bemüht werden müssen? besseren vorschlag? PerfCtr hat extrem wenig Overhead, was spricht dagegen? Ok, werde ich mal testen. Danke. Aber eine allgemeine ANSI-C Lösung für das Problem gibt es nicht, oder? 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. :
Bearbeitet durch User
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 Hans-Georg Lehnard schrieb: > wenn du unter Windows 1 sec warten willst benutze einfach: das will er aber nicht. Da wir ja über C++ reden, darf ich C++11 annehmen? Dann z.B. so:
Nur mal sicherheitshalber, da über den Kontext nichts gesagt wurde: Bitte nicht in einem UI-Thread so etwas veranstalten. 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. Caligulaminus schrieb: > Da wir ja über C++ reden, darf ich C++11 annehmen? Klar > Dann z.B. so: >
Genau danach hab ich gesucht, danke :-) 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. 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.
|
|