Frage von adulescentulus, 60

Suche eine Beispiel für eine Endlos-Schleife in c++ ohne 100% CPU last?

Guten Tag,

mein Programm führt ein Polling auf ein USB Gerät aus (das Gerät ist leider passiv).

Vereinfachter Code:

while(true){
     MyClass->PollDevice();
     usleep(200); // 200ms warten
}

Das Problem ist das das Programm 100% der CPU zieht. Nun würde ich gerne wissen ob mir jemand ein Beispiel einer Endlosschleife zeigen könnte, die NICHT die komplette CPU auf Dauer belegt.

Ich bin auch schon auf Multithread und Semaphore gestoßen, aber damit bin ich nicht zurecht gekommen, bzw bin ich auf das selbe Resultat gestoßen.

Noch ein paar Fakten zum Programm:

  • geschrieben in C++
  • OS ist Linux
  • es muss alle 200ms ein Poll passieren oder das Gerät schaltet sich in ein Standby modus
  • ein Poll dauert ca 100ms
  • Das Programm läuft momentan in ein fork()

Danke Sehr :)

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von TeeTier, Community-Experte für programmieren, 19

Du hast 100% CPU Last, weil du 200 Mikrosekunden wartest, und nicht 200 Millisekunden!

Außerdem ist die Zahl 200 etwas hart an der Kante, wenn wirklich alle 200ms ein Poll erwartet wird. Nimm lieber 175 oder so. :)

Probier mal:

usleep(175000);

Im Übrigen gilt usleep() als obsolet, und du solltst lieber nanosleep() verwenden:

#include <time.h>

// ...

struct timespec req;
req.tv_sec = 0;
req.tv_nsec = 175000000;

while(true){
MyClass->PollDevice();
nanosleep(&req, NULL);
}

Aaaaaber, da du ja von C++ und nicht von ANSI-C sprichst, kannst du auch einfach den plattformübergreifenden Weg mithilfe der STL nehmen:

#include <chrono>
#include <thread>

// ...

using namespace std;
auto millis = chrono::milliseconds(175);

while (true) {
MyClass->PollDevice();
this_thread::sleep_for(millis);
}

Dazu muss dein Compiler aber mindestens C++11 unterstützen.

Naja, viel Spaß! :)

Antwort
von valvaris, 40

Das Problem liegt vermutlich nicht in der Schleife, sondern deine Poll...
Com-port-bibliotheken bieten Meist Callbacks an, wenn Daten anstehen, genauso wie TCP-Bibliotheken.

Kommentar von adulescentulus ,

Also es ist ein USB CoinAcceptor und ich nehme für den Poll eine CccTalk Library direkt vom Hersteller

Antwort
von Orsovai, 33

Hallo,

Versuchs mal hiermit

http://cpulimit.sourceforge.net

Keine passende Antwort gefunden?

Fragen Sie die Community