Was ist der beste Weg, eine Schleife zu verlassen, nachdem eine verstrichenen Zeit von 30 ms in C ++

StackOverflow https://stackoverflow.com/questions/946167

  •  09-09-2019
  •  | 
  •  

Frage

Was ist der beste Weg, eine Schleife zu verlassen, wie die Nähe von 30ms wie möglich in C ++. Polling boost: microsec_clock? Polling QTime? Etwas anderes?

So etwas wie:

A = now;
for (blah; blah; blah) {
    Blah();
    if (now - A > 30000)
         break;
}

Es sollte unter Linux, OS X und Windows.

Die Berechnungen in der Schleife sind für eine Simulation zu aktualisieren. Alle 30 ms, ich möchte das Ansichtsfenster aktualisieren.

War es hilfreich?

Lösung

Das Code-Snippet Beispiel in diesem Link so ziemlich das tut, was Sie wollen:

http://www.cplusplus.com/reference/clibrary/ctime/ Uhr /

Angepasst von ihrem Beispiel:

void runwait ( int seconds )
{
   clock_t endwait;
   endwait = clock () + seconds * CLOCKS_PER_SEC ;
   while (clock() < endwait)
   {
      /* Do stuff while waiting */
   }
}

Andere Tipps

  

Die Berechnungen in der Schleife sind für   Aktualisieren einer Simulation. Alle 30 ms, würde ich   wie das Ansichtsfenster zu aktualisieren.

Haben Sie die Verwendung von Threads in Betracht gezogen? Was Sie beschreiben, scheint das perfekte Beispiel dafür, warum Sie Threads statt Timer verwendet werden soll.

Der Hauptprozess-Thread hält den Benutzeroberfläche kümmern, und hat eine QTimer auf 30ms gesetzt, sie zu aktualisieren. Sie sperrt ein QMutex Zugriff auf die Daten zu haben, führt das Update, und gibt den Mutex.

Der zweite Thread (siehe QThread ) macht die Simulation. Für jeden Zyklus, sperrt es die QMutex, macht die Berechnungen und gibt den Mutex, wenn die Daten in einem stabilen Zustand (geeignet für das UI-Update) ist.

Mit dem zunehmenden Trend zu Multi-Core-Prozessoren, sollten Sie mehr und mehr denken Fäden zur Verwendung als Timer zur Verwendung. Ihre Anwendungen automatisch profitieren von der erhöhten Leistung (mehr Kerne) der neuen Prozessoren.

Während dies nicht die Frage beantworten, könnte es noch einen Blick auf die Lösung. Was ist mit dem Simulationscode und die Benutzeroberfläche in verschiedenen Threads platzieren? Wenn Sie Qt verwenden, können periodische Aktualisierung realisiert werden mit Hilfe einer Zeitschaltuhr oder sogar QThread :: Msleep ( ) . Sie können die Gewindemandelbrots Beispiel Ihren Bedarf anpassen.

Wenn Sie tun, bis eine bestimmte Zeit abgelaufen ist, dann Antwort des docflabby ist spot-on. Wenn Sie jedoch nur warten müssen, nichts zu tun, bis eine bestimmte Zeit abgelaufen ist, dann sollten Sie eine href verwenden <= „http://www.opengroup.org/onlinepubs/000095399/functions/usleep.html“ rel = "nofollow noreferrer"> usleep()

Kurze Antwort ist: Sie kann nicht im Allgemeinen, aber Sie können, wenn Sie auf dem richtigen Betriebssystem oder auf der richtigen Hardware ausgeführt werden

.

Sie können in der Nähe von 30ms auf alle OS gets eine Montage Anruf auf Intel-Systemen und etwas anderes auf anderen Architekturen verwenden. Ich werde die Referenzraben und die Antwort bearbeiten, um den Code zu enthalten, wenn ich es finde.

Das Problem ist der Time-Slicing-Algorithmus und wie nah an das Ende Ihrer Zeitscheibe Sie auf einem Multi-Tasking-Betriebssystem sind.

Auf einigen Echtzeit-Betriebssysteme gibt es einen Systemaufruf in einer Systembibliothek können Sie machen, aber ich bin mir nicht sicher, was das Anruf wäre.

edit: LOL! Jemand hat bereits einen ähnlichen Schnipsel auf SO: Timer-Funktion Zeit zur Verfügung zu stellen in Nanosekunden mit C ++

VonC den Kommentar mit dem CPU-Timer Assembler-Code in ihm erhalten hat.

Nach Ihrer Frage, alle 30ms Sie möchten, dass das Ansichtsfenster aktualisieren. Ich schrieb eine ähnliche App einmal, dass sondierten Hardware alle 500ms für ähnliche Sachen. Während dies nicht direkt Ihre Frage beantworten, ich habe folgende followups:

  • Sind Sie sicher, dass Blah (), das Ansichtsfenster für die Aktualisierung, in weniger als 30 ms in jedem Fall ausführen kann?
  • Es scheint mehr wie Laufen Blah () durch einen Timer-Rückruf besser gemacht werden würde.
  • Es ist sehr schwer, eine Bibliothek Timer-Objekt zu finden, das auf einem 30ms-Intervall zu tun Updates in einem grafischen Rahmen vorantreiben wird. Unter Windows XP fand ich, dass die Standard-Timer Win32-API, die Fenstermeldungen auf Timer-Intervall Ablauf drückt, sogar auf einem 2 GHz P4, kein Updates tun könnten schneller als ein 300ms Intervall, egal wie niedrig ich das Zeitintervall eingestellt auf dem Timer. Zwar gibt es Hochleistungs Timer zur Verfügung in dem Win32-API waren, haben sie viele Einschränkungen, nämlich, dass Sie keine IPC (wie Update UI-Widgets) tun können, in einer Schleife wie die, die Sie wie oben zitiert.
  • Im Grunde ist das Fazit Sie sehr sorgfältig zu planen haben, wie Sie haben wollen Updates auftreten. Möglicherweise müssen Threads verwenden, und sehen Sie, wie Sie das Ansichtsfenster aktualisieren möchten.

Nur ein paar Dinge zu denken. Sie überraschte mich, wenn ich an meinem Projekt gearbeitet. Wenn Sie diese Dinge durch bereits gedacht haben, ignorieren Sie bitte meine Antwort. 0)

Sie sollten erwägen nur das Ansichtsfenster Aktualisierung alle N Simulationsschritte eher als alle K Millisekunden. Wenn diese (sagen wir) eine ernsthafte kommerzielle Anwendung ist, dann wirst du wahrscheinlich die Multi-Thread-Route an einem anderen vorgeschlagen gehen zu wollen, aber wenn (sagen wir) es ist für den persönlichen oder begrenzt Publikum Gebrauch und was sind Sie wirklich interessiert alle-N-Schritte werden die Details, was auch immer es ist, den Sie simulieren, dann ist einfach, tragbar und kann auch gut genug sein werden, immer auf mit.

Siehe Queryperformancecounter und Queryperformance

Wenn Sie Qt verwenden, hier ist eine einfache Möglichkeit, dies zu tun:

QTimer* t = new QTimer( parent ) ;
t->setInterval( 30 ) ; // in msec
t->setSingleShot( false ) ;
connect( t, SIGNAL( timeout() ), viewPort, SLOT( redraw() ) ) ;

Sie müssen viewPort und redraw() angeben. Dann den Timer mit t->start() starten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top