Zeitmessen im Millisekundenbereich



  • Wie genau musst du das denn haben???

    Wenn du die impule jede ms abragst, dann kann deine zeit auch nicht viel genauer sein.

    Oder sollte die Frage darauf hin deuten wie du die Zeit startest und wieder stoppst??



  • Du wirst vermtulich nicht umhin kommen dies über einen Hochperformance-Counter wie zum Beispiel den TSC des Prozessors zu verwenden (QueryPerformanceCounter/QueryPerformanceFrequency) Allerdings sei dazu gesagt, dass dies ein heisses Eisen ist seit es CPUs mit variabler Taktfrequenz und mehreren Cores gibt. (siehe auch: http://www.heise.de/newsticker/meldung/65802 )

    Möglich wäre auch etwas über eine TimerQueue zu lösen. Das ist aber tiefstes WinAPI.



  • jaa, erstmal danke 😉
    Ich hab da eine Hardware... USB-Experiment Interface Board nennt sich das Teil... Das Board krieg ich auch in C++ eingebunden und kann damit halt rumspielen... Da in dem Beispiel-Projekt vom Hersteller auch nur ein Timer benutzt wird um die Eingänge abzufragen, dacht ich mir übernehm ich das doch einfach mal 😉
    So nun soll halt durch diesen Eingang, der halt durch einen Timer abgefragt wird, eine weitere Uhr gestartet werden und diese Uhr soll im Millisekundenbereich läufen... wenn man, so wie ichs jetzt versucht hab, mit einem TTimer eine Variable hochzählt, dann stellt man schnell fest, dass höchstens Zehntelsekunden einigermaßen hinkommen, wobei das auch noch nicht genaue Sekunden sind...
    Nun hoffe ich, dass ich mein Problem verdeutlicht hab?
    vielen dank nochmal....

    Mit diesen Highperformence dingern kenn ich mich nicht aus 😃 scheiße....



  • fischdeba schrieb:

    Mit diesen Highperformence dingern kenn ich mich nicht aus 😃 scheiße....

    Willkommen in der Welt der Entwickler....



  • so im voraus, sind die schwer zu handhaben? 😉



  • nein.





  • @F98:
    ahhh perfekt, vielen dank, beim quelltext lesen kann man ne menge lernen 😉

    Guuut, also soweit hab ichs geschnallt, diverenz zwischen ende und anfang... wie kommt der denn auf negative werte, wenn man z.b. 5 sekunden wartet??

    Vielleicht ist das ja mal einfacher mit Quelltext 😉

    void __fastcall TForm1::Timer1Timer(TObject *Sender)
    { //Timer->Interval = 1;
      //Stoppuhr
     LARGE_INTEGER Frequency, TimerStart, TimerStop;
     __int64 Latency;
     double Usedtime;
     int Digits = 3; // 3 Nachkommastellen
    
     if(ReadDigitalChannel(1))//Starten durch USB-Board Impuls Kanal 1
      {
    
        // erst die Latzenzzeit des Counters berechnen:
        QueryPerformanceFrequency(&Frequency);
        QueryPerformanceCounter(&TimerStart);
        QueryPerformanceCounter(&TimerStop);
        Latency = TimerStop.QuadPart - TimerStart.QuadPart;
    
        QueryPerformanceCounter(&TimerStart);
    
    // Code für den die Zeit gemessen werden soll
    
      }
     if(ReadDigitalChannel(2))//Stoppen durch USB-Board Impuls Kanal 2
       {
        QueryPerformanceCounter(&TimerStop);
    
        Usedtime = (((double)TimerStop.QuadPart - (double)TimerStart.QuadPart) - (double)Latency) / (double)Frequency.QuadPart;
        Edit2->Text = FloatToStrF(Usedtime, ffFixed, 16, Digits) + " s";
       }
    
    }
    


  • Was für eine CPU? bzw. bleibt die Counterfrequenz gleich?



  • Hm, abgesehen von einer Klammerung um die Subtraktion sieht das eigentlich ok aus und sollte funktionieren.
    Verschieb das doch bitte mal in eine Button-Click Methode und führ das manuell aus - nur um auszuschließen, dass der Timer da irgendwie reinpfuscht.



  • Button-Click-Methode macht auch nur Müll! irgendwie hab ich das gefühl, dass wenn man diese Query Teile auseinander reißt, dann kann man damit nicht arbeiten...

    Prozessor : P4 3.0 GHz



  • lass mal das ganze double gecaste weg.
    Sprich:

    Usedtime = (double)((TimerStop.QuadPart - TimerStart.QuadPart) - Latency) / Frequency.QuadPart)
    

    Und schau dir mal im Debugger die Werte an welche in den QuadParts stehen und rechne mal von Hand nach.


Anmelden zum Antworten