C++ While-Schleife, usleep()/Standbymodus (), wie nicht zu benutzen, 90% der CPU? (Ubuntu 12.04)
Nehme an, dass ich C++ - code wie
#include "myheaderfiles.h"
//..some stuff
//...some more stuff
int main()
{
double milliseconds;
int seconds;
int minutes;
int timelimit=2;
...
...
//...code here that increments
//.....milliseconds,seconds, and minutes
while(minutes <=timelimit)
{
//...do stuff
if(milliseconds>500)
{
//...do stuff
//...every half second
} //end if
} //end while
}//end main
Das Programm läuft Prima und tut, was seine angeblich zu tun, aber es wird mit bis zu 90%+ meiner cpu.
Es wurde mir vorgeschlagen, zu verwenden, usleep() in der while-Schleife immer 100ms oder so, da ich wirklich nur die Sorge um Dinge tun, die alle 500 MS sowieso. So, Sie Schwein die CPU wenn Sie nicht gebraucht werden.
So, ich habe es zu meiner while-Schleife wie so
while(minutes <=timelimit)
{
//...do stuff
if(milliseconds>500)
{
//...do stuff
//...every half second
} //end if
usleep(100000);
} //end while
Kompiliert er fein, aber wenn ich es ausführen, wird das Programm hängen direkt an usleep und nie wieder zurückkehren. Ich habe irgendwo gelesen, dass vor dem Aufruf usleep, braucht man zum leeren aller Puffer, also habe ich geleert, alle Datei-streams und couts etc etc. Immer noch kein Glück.
Ich gesucht habe für 2 Tage für eine Lösung. Ich habe sleep() auch kein Glück.
Fand ich ein paar alternativen, aber Sie scheinen kompliziert und werden noch eine Menge code zu meinem Programm, dass ich nicht wirklich ganz verstehen, die komplizierter und machen es chaotisch, und es könnte nicht funktionieren.
Ich habe nie wirklich zu viel Gedanken in meine while () - Schleifen vor, weil die meisten der Programme, die ich schrieb, waren für mikrocontroller oder FPGAs ist das kein problem, zu hog den Prozessor.
Wenn jemand helfen kann.... alle Ressourcen, links,Bücher? Danke.
Können Sie Ihre komplette while () - Schleife. Es könnte viele Gründe für diese, und dies ist bekannt als busy-loop problem. usleep() würde nicht zu hängen. Es ist etwas anderes falsch in Ihrem code.
Ich wundere mich, -- gibt es etwas zu tun für das Programm oder ist es einfach nur tatenlos polling irgendwo? Wenn es etwas zu tun, bekommen es schneller zu erledigen sollte nicht Schaden (auf *nix oder windows könnte man die prio aber). Wenn Sie polling, vielleicht gibt es eine ereignisgesteuerte Lösung?
warum gehst du nicht einfach registrieren, um eine timer-wake-up und rufen Sie jede halbe Sekunde, wenn das, was Sie wollen? dies scheint nicht die richtige Lösung, um mit zu beginnen. sind Sie sicher, es hängt bei usleep? vielleicht bist du nicht die Inkrementierung von 'Millisekunden' richtig.
verwenden Sie das signal in Ihrem Programm, durch Zufall?
InformationsquelleAutor user3474042 | 2014-04-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein Ansatz, etwas kommt aus dem falschen Ende. Ein Programm sollte verbrauchen 90-100% CPU so lange, wie es ist, etwas sinnvolles zu tun (und es blockieren sollte sonst konsumieren zero CPU).
Schlafen in zwischen wird die Ausführung länger ohne guten Grund, und verbrauchen mehr Energie als nur die Arbeit macht so schnell wie möglich (bei 100% CPU) und dann ganz blockiert, bis weitere arbeiten zur Verfügung steht oder bis einige andere wichtige Sache (z.B. eine halbe Sekunde vergangen ist, wenn diese Dinge für dich) passiert.
Mit, dass in Geist, Struktur, Ihr Programm in einer Weise begrifflich wie:
Auch nicht schlafen während der Ausführung, aber benutzen der Timer (z.B.
setitimer
), etwas zu tun, in regelmäßigen Abständen. Dies wird nicht nur effizienter, sondern auch viel mehr präzise und zuverlässig.Genau wie Sie diese umsetzen, hängt davon ab wie Mobil Sie möchten, dass Ihre software zu werden. Unter Ubuntu/Linux können Sie mit z.B. Nutzung von APIs wie
epoll_wait
miteventfd
anstatt schriftlich einen signal-handler für den timer.InformationsquelleAutor Damon
Dieser code wie erwartet funktioniert bei mir (unter OSX).
InformationsquelleAutor Buddy
Es ist ein logisches Problem, oder vielleicht sind Sie mehrere Zähler? Da sagte Sie, Sie habe getan, mikrocontroller, ich nehme an, Sie versuchen zu verwenden, clock-Zyklen als eine Methode der Zählung der beim Aufruf der system-Timer? Auch, was hat mich zu hinterfragen ist, wenn Sie zur Verwendung empfohlen usleep(x), warum verwenden Sie doppelte für eine Millisekunde? usleep(1) 1 Mikrosekunde == 1000 Millisekunden. Sleep(x) ist ein Zähler pro x zweiter, so wird das system auszusetzen, es ist die aktuelle Aufgabe für den Betrag x Sekunden.
Wenn Sie wollte 500ms dann ersetzen usleep(ZWEITE) mit usleep(500*MILLISEKUNDE).
Ich schlage vor, Sie einen debugger verwenden und Schritt für Schritt durch den code, um zu sehen, was passiert.
InformationsquelleAutor Tony