for-Schleife mit fester Dauer pro durchlauf ?



  • Hallo zusammen ...

    Ich habe hier ein kleines Konsolen-Programm geschrieben, welches Daten erhält und diese verarbeitet. Das ganze ist in einer (recht großen) for-Schleife gelöst. Je nach Datensatz dauert die Verarbeitung in der Schleife unterschiedlich lang. Da das Programm aber synchron zu einem anderen laufen muss, ist es notwendig, das ein Zyklus eine feste Zeit benötigt.

    Bis jetzt habe ich das Ganze so gelöst, dass ich je nach erwarteten Datensätzen die Durchläufe gestoppt habe und dann mit einer Sleep-Anweisung die Restzeit aufgefüllt habe. Das ist aber extrem unflexibel und auch recht ungenau.

    Am liebsten wäre es mir, wenn zu Beginn eines Durchlaufs ein "Timer" gestartet würde und dann am Ende so lange gewartet würde, bis eine vorgegebene Zeit (in ms) verstrichen ist.

    Leider hab ich dazu nicht wirklich was passendes gefunden 😕

    Würde mich sehr über etwas Hilfe freuen!



  • wie genau muss es denn sein? welches os?



  • Also normalerweise würde ich behaupten, dass es allgemein ziemlich schwierig (und auf den meisten Betriebssystemen auch unmöglich) ist ein time-scheduling so genau hinzubekommen, da sich immer (in einem multitasking system) andere Prozesse dazwischen"drängeln" werden und sogar die Abarbeitung deiner beiden Prozesse sequenziell ausgeführt werden (gesetzt dem Falle, dass es sich um eine Ein-Prozessor-Maschine handelt).

    Du solltest dir eventuell über die gegenseitige Synchronisation deiner Prozesse Gedanken machen (ob der eine auch gegebenenfalls auf die Abarbeitung des anderen warten kann).



  • Also OS ist Windows XP (Prof).
    Da die Schleife zT einige 100mal durchlaufen wird, wäre eine Genauigkeit im Millisekundenbereich schon schön.

    Ich hatte doch gehofft, dass es vielleicht doch einfacher ist, als es anscheinend der Fall ist.
    Kann man nicht einfach die Systemuhr "anzapfen"? Obwohl die wohl nicht so genau gehen wird, oder?
    Der PC auf dem das Programm laufen soll ist übrigens ein Intel QuadCore (4x 2,5GHz). Hilft das was? 🙄



  • mh also ein lösung wäre folgende

    time_t t, max_time=100;
    
    for(...)
    {
        t = time(NULL);  // oder so waren die befehle, sry hab die nicht merh ganz im kopf, aber egal geht ja nur ums prinzip
    
        // ... berechnungen
        if ( max_time-t <= 0 )
           Sleep(max_time-t);
    }
    


  • google mal nach "boost asio tutorial", da wird sowas in der Art mit "gleichlang dauernden Schleifendurchgängen" auch besprochen (ich glaub ne Konsolenausgabe genau alle 5 Sekunden oder sowas)
    Wenn du deine zwei Prozesse allerdings richtig synchronisieren willst, statt sie unabhängig in etwa den gleichen Zeittakten laufen zu lassen, kommst du um Synchronisierung wohl nicht herum. Da wäre eine interprocess-barrier as erste was mir einfällt.



  • Falls es nur wichtig ist, das bestimmte Teile in beiden Programmen (in etwa) zur selben Zeit ablaufen, dann kannst du auch 2 CriticalSection nehmen - falls ich jetzt keinen Denkfehler hatte, sollte man das damit auch hinbekommen ^^

    bb



  • unskilled schrieb:

    kannst du auch 2 CriticalSection nehmen - falls ich jetzt keinen Denkfehler hatte, sollte man das damit auch hinbekommen ^^

    Klar geht das - die beiden Critical Sections haben dann einfach als Bedingung, dass in allen anderen Prozessen (in dem Fall einer) ein Flag auf true gesetzt wird. Das ist eine der möglichen Implementierungen einer Barrier 😉


Anmelden zum Antworten