Timer parallel zu anderen Funktion laufen lassen?



  • Hallo

    ich habe eine Funktion, die zur Zeit ca. 10-15 sek. braucht zum durchlaufen. Ich würde jetzt gerne die Zeit messen lassen, aber vom Programm, nicht selber mit der Stoppuhr.
    Ich habe einen Timer auf die Form gepackt, und lasse ihn jede Sekunde einmal die OnTimer-Funktion aufrufen. Nur leider passiert nix, solange meine Funktion durchläuft. Erst nach Ende des Durchlaufs reagiert der Timer wieder.

    Wie bekomme ich es hin, dass der Timer parallel zu meiner Funktion läuft?

    Gruß Michel



  • MichelM schrieb:

    Wie bekomme ich es hin, dass der Timer parallel zu meiner Funktion läuft?

    Indem du nicht einen für diesen Zweck völlig ungeeigneten Timer verwendest, sondern mithilfe von GetTickCount() die Zeitdifferenz mißt und in Sekunden umrechnest. MSDN hilft.

    Edit:

    Die Signatur von MichelM schrieb:

    _________________
    Benutze den C++ Builder 2010

    👍
    Die explizite Angabe erleichtert zukünftige Ferndiagnosen.



  • audacia schrieb:

    MichelM schrieb:

    Wie bekomme ich es hin, dass der Timer parallel zu meiner Funktion läuft?

    Indem du nicht einen für diesen Zweck völlig ungeeigneten Timer verwendest, sondern mithilfe von GetTickCount() die Zeitdifferenz mißt und in Sekunden umrechnest. MSDN hilft.

    Werde ich mir gerne zu Gemüte führen, morgen 🙂

    audacia schrieb:

    Edit:

    Die Signatur von MichelM schrieb:

    _________________
    Benutze den C++ Builder 2010

    👍
    Die explizite Angabe erleichtert zukünftige Ferndiagnosen.

    Ja so vergesse ich das nicht mehr 😉



  • audacia schrieb:

    Indem du nicht einen für diesen Zweck völlig ungeeigneten Timer verwendest, sondern mithilfe von GetTickCount() die Zeitdifferenz mißt und in Sekunden umrechnest. MSDN hilft.

    Windows hat auch Timer, die parallel zum Programm ausgeführt werden.
    Siehe CreateThreadpoolTimer in der MSDN.



  • Nachtrag:

    Der native Threadpool geht erst ab Vista, im Gegensatz zum Threadpool von .net.

    Trotzdem sollte man mal einen Blick darauf werfen. Mit handgemachten Threads sind Programme, die Prozessoren abhängig von der Zahl der Kerne auslasten, nicht so einfach.



  • Wie audacia schon sagte kann man Timer oder Threads zur Laufzeitmessung von Funktionen/Methoden nicht benutzen. Wie audacia schon sagte benutzt man einen hochauflösenden Counter (z.B. QueryPerformanceCounter) zu Beginn und zum Ende der Messung und benutzt die Differenz zur Bestimmung der Laufzeit. Das geht auch mit irgendwelchen Timern von Vista nicht.



  • DocShoe schrieb:

    Das geht auch mit irgendwelchen Timern von Vista nicht.

    Doch. z.B. mit GetThreadTimes.

    Wie misst du mit QueryPerformanceCounter die Aufrufzeit einer 10-15 Sekunden laufenden Funktion ? Willst du die Prozess- und Threadpriorität auf Timecritical setzen und den Rest von Windows solange anhalten ?





  • Das ist mir schon klar. Nur wenn der Thread wirklich permanent auf einem Kern rechnen kann, bekommt man mit GetThreadTimes eine gute untere Schranke.

    Aber die Methode nur die Start- und Endzeit der Funktion zu messen, liefert auch nur eine obere Schranke. Die Wahrheit liegt irgendwo dazwischen.

    Im übrigen habe ich das erste Posting nur geschrieben, um darauf hinzuweisen, dass es sehr wohl Timer gibt, die nebenläufig arbeiten. Wenn man mit Funktionen arbeitet, die so lange rechnen, wird man sich zwangsläufig mit Threads beschäftigen müssen.



  • nn schrieb:

    gute untere Schranke.

    bessere obere Schranke



  • Das mit GetTickCount() funktioniert gut! Ich messe vorher und hinterher die Zeitpunkte und bilde die Differenz.

    DWORD aktZeit1 = GetTickCount() ;
    DWORD aktZeit2 = GetTickCount() ;
    Label->Caption = IntToStr(int(aktZeit2 - aktZeit1) / 1000);
    

    Aber was ist, wenn ich während meiner Funktion den Fortschritt anzeigen möchte?
    Ich mach mal dazu ein neues Thema auf!


Anmelden zum Antworten