4 Stimmen

C++ Was kann ich statt der Funktion sleep() verwenden?

Ich baue Scrobbler, und ich möchte, dass mein Programm 10 Sekunden nach einem Songwechsel wartet, bevor es scrobbelt. Ich habe sleep benutzt, aber ich habe gemerkt, dass wenn das Lied während dieser 10 Sekunden wechselt, das Programm das alte Lied abschickt und ein neues bekommt. Ich möchte, dass der Code bei einem Liedwechsel wieder von vorne beginnt.

Ich verwende Music Player Daemon (MPD) und libmpd, um die Tags der Lieder abzurufen.

Hinweis: Das Programm läuft unter Unix.

2voto

Damon Punkte 64271

Es hängt sehr davon ab, wie Ihr Programm funktioniert, aber im Prinzip wäre es am einfachsten, wenn Sie weiterhin sleep und siehe ob der Benutzer das Lied geändert hat, bevor er diese Daten gesendet hat (nachdem der Ruhezustand zurückgekehrt ist). Anstelle von "versuchen Sie, besser zu schlafen" wäre das Ziel also "prüfen Sie vor dem Senden, ob die Daten, die Sie senden, wirklich gültig sind".

Eine andere Möglichkeit wäre, auf eine epoll entweder mit der Zeitüberschreitung für den Schlaf oder besser noch mit einer timerfd und benachrichtigen den Songwechsel über eine eventfd . Dies hat den Vorteil, dass es "kostenlos" ist, wenn Sie ohnehin eine zuverlässige Kommunikation zwischen den Threads und eine Benachrichtigung über die Bereitschaft benötigen, was höchstwahrscheinlich der Fall ist (natürlich müssen Sie mindestens einen zusätzlichen GUI-Thread haben, da der Benutzer sonst nicht in der Lage wäre, die Songs zu wechseln, während Sie blockiert sind).

1voto

Rakis Punkte 7629

Der Vorschlag von Damon ist gut und könnte ein besseres Gesamtkonzept darstellen. Wenn Sie allerdings etwas Schnelles suchen, könnten Sie in Erwägung ziehen, einfach ein Signal an Ihre Anwendung zu senden, wenn sich das Lied ändert. Das unterbricht die sleep() Systemaufruf und veranlassen ihn zur vorzeitigen Rückkehr. Ihre Anwendung müsste dann nur noch die vorzeitige Rückkehr entsprechend behandeln. Je nach Ihrer Implementierung ist dies möglicherweise nicht sinnvoll, aber es könnte eine schnelle Lösung sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X