Prozesszeit aus Thread mit QPC



  • ich möchte aus einem Thread die Prozesszeit auslesen und habe das so gelöst:

    //header:
    class MeinThread : public TThread
    {
    private:
    	LONGLONG frequenz;
    	LONGLONG startZeit;
    	LONGLONG aktuelleZeit;
    	double prozesszeit;
    
    protected:
    	void __fastcall Execute();
    public:
    	__fastcall MeinThread(bool CreateSuspended);
    	void __fastcall UpdateCaption();
    };
    
    //cpp:
    __fastcall MeinThread::MeinThread(bool CreateSuspended)
    	: TThread(CreateSuspended)
    {
    	QueryPerformanceFrequency((LARGE_INTEGER*)&frequenz);
    	Priority = tpTimeCritical;
    }
    //---------------------------------------------------------------------------
    void __fastcall MeinThread::Execute()
    {
    	QueryPerformanceCounter((LARGE_INTEGER*)&startZeit);
    
    	while (!Terminated)
    	{
    		QueryPerformanceCounter((LARGE_INTEGER*)&aktuelleZeit);
    		prozesszeit = (aktuelleZeit - startZeit) / (double)frequenz;
    		Synchronize(UpdateCaption);
    		Sleep(0.01);
    	}
    }
    //---------------------------------------------------------------------------
    void __fastcall MeinThread::UpdateCaption()
    {
    	frmHO->labProzesszeit->Caption = prozesszeit; //Ausgabe auf meiner Form in Label
    }
    

    So habe ich eine sehr genaue Prozesszeit die ich abfragen kann. Was haltet ihr davon?

    Die eigentliche Frage doch dazu:
    Die Zeit wird als Gleitkommawert ausgegeben.

    Ich möchte die Prozesszeit noch als Zeit in Format: hh🇲🇲🇸🇸:msms speichern.
    Wie kann ich das am besten lösen?

    Grüße rudpower



  • So weit ich das sehe: gar nicht. Ist das nicht nur einfach die Anzahl der Ticks, die seit dem Einschalten des Rechners vergangen sind und somit keinen Bezug zu Datum und Uhrzeit hat?

    Gruß KK



  • es soll auch nicht die Zeit als Datum/Uhrzeit dargestellt werden sondern die Zeit die seid dem Aufruf der Funktion MeinThread->Resume() vergangen ist. Durch die Berechnung prozesszeit = (aktuelleZeit - startZeit) / (double)frequenz; erhält man die Anzahl der Sekunden als double Wert. Die will ich dann in dem oben gezeigten Format anzeigen lassen.



  • Hallo

    na wenn du schon weist wie du aus den Ticks die Sekunden rauskriegst, dann sollte doch die Formatierung in hh🇲🇲🇸🇸:msms kein Problem sein. Wie viele Sekunden sind eine Minute?

    bis bald
    akari



  • ja das ist klar. Ich dachte nur vll. gibt es ja eine Funktion um das einfacher zu gestalten. Ich dachte evtl das man die Zahl in TDateTime umwandelt dann könnte man das mit FormatDateTime("hh:nn:ss:zz", meinezeit); prima so anzeigen wie ich das wollte.



  • Hallo

    Zumindestens im BCB5 beherrscht TDateTime nicht die Umrechnung von Sekunden in HH::MM:SS. Du must die Sekunden selber in Sekunden, Minuten und Stunden aufteilen. Dann kannst du aber TDateTime benutzen, um die Zahlen in einen String zu formatieren.

    bis bald
    akari



  • hab mal versucht eine Funktion zu schreiben, komm aber grad nicht weiter:

    AnsiString MeinThread::CPUZeitToTime()
    {
    	int h, min, sec, ms;
       ms  = prozesszeit * 1000;
       sec = (int) prozesszeit;
       min = sec / 60;
       h   = min / 60;
       TDateTime neueZeit = StrToTime(IntToStr(h)+":"+IntToStr(min)+":"+IntToStr(sec));
       return FormatDateTime("hh:nn:ss:zz",neueZeit);
    }
    


  • Hallo

    float prozesszeit = 3163.210;
      unsigned int ms = prozesszeit * 1000.0;
      unsigned int sec = ms / 1000;
      ms = ms - sec * 1000;
      unsigned int min = sec / 60;
      sec = sec - min * 60;
      unsigned int hours = min / 60;
      min = min - hours * 60;
      TDateTime time(hours, min, sec, ms);
      Edit1->Text = time.FormatString("hh:nn:ss:zz");
    

    Etwaige Ungenauigkeiten bei den Millisekunden stammen aus der Ungenauigkeit durch float, nicht durch die Rechnung.
    Und wenn die Zeiträume ein paar Stunden übersteigen, solltest du auch __int64 als Typ für ms und sec verwenden.

    bis bald
    akari



  • super, vielen vielen Dank. Genau das hab ich gesucht.

    Grüße rudpower



  • Ich hätte ja glatt mal versucht, den double-Wert an TDateTime::Val zuzuweisen. 😉

    Gruß KK



  • was meinst du damit? was ist Val?

    lass ich den Thread auf meinen Laptop (2Ghz DuoCore, 3GB RAM) laufen läuft alles prima. Die Prozesszeit erhöht sich auch weiter ohne Mukken wenn ich das Fenste verschiebe oder wild auf der Oberfläche rumklick. Hab das Programm im Builder 2009 und Builder 5 geschrieben und kompiliert. Nun mein Problem. Da meine Anwendung sehr zeitkritisch ist habe ich mir einen schnellen Rechner angeschafft (3,2GHz Core i7, 12GB RAM) lass ich das Programm dort laufen und klick auf die Titelleiste des Programms friert das Programm fast ein und wird total stockend. Die gleiche Exe läuft auf meinen dagegen langsamen Laptop problemlos. Was kann das sein.
    Was mir aufgefallen ist, das die Frequenz des PerformanceCounters bei dem Laptop auf 3,58 MHz liegt (wenn ich die Variable frequenz anzeigen lasse). Bei dem i7 Rechner ist die Frequenz viel höher, nämlich wie die Taktfrequenz der CPU (3,2GHz). Hab gelesen das die 3,2MHz die Frequenz eines Hardwaretimers im Prozessor ist. Beim i7 scheint das wohl die CPU zu sein. Nur kann es doch nicht sein, das ein so schneller Rechner da ins stocken kommt und ältere langsame Rechner das schaffen. Was kann das sein?



  • Mit Erfahrung zu zeitkritischen Anwendungen auf einem Core i7 kann ich noch nicht dienen, aber ich habe früher mit dem BCB5 zeitkritische Messtechnikanwendungen entwickelt.

    Wenn es da etwas gab, was man unbedingt vermeiden sollte, dann aus zeitkrischen Threads heraus mit Synchronize zu arbeiten.

    Nur so ein Gefühl ...


Anmelden zum Antworten