Thread - Selbstgeschriebene Timer Funktion stimmt nicht :-(



  • Habe fogenden (Timer-)Thread:
    UINT CTrainKlMal::thrFunction(LPVOID pParam)
    {
    int* pFlag = (int*) pParam;
    m_iZeitMS = 0;

    do
    {
    m_iZeitMS++;
    Sleep(1);
    }
    while(m_iFlag == 1);

    return 0;
    }

    Ich rufe diesen so auf:

    CWinThread* pThread = AfxBeginThread (thrFunction, &m_iFlag);

    und so beende ich ihn:

    m_iFlag = 0;

    Nun sollte in m_iZeitMS die Zeit wo der Thread gelaufen ist in Millisekunden stehen.
    Dies tut es auch MANCHMAL!?!?!?! Meistens steht aber eine falsche Zeit in der Vareable (manchmal um das 100-fache falsch!!!!).
    Weiß jemand warum oder hat jemand einen anderen Vorschlag wie ich das machen könnte???

    mfg
    Fink Christoph



  • Auf die Sleep() Zeit würde ich mich nicht unbedingt verlassen.

    Für soetwas benutze ich QueryPerformanceCounter.



  • Könntest du mir ein Code-Beispiel für diese Funktion posten???



  • Diese Funktion liefert die verstrichene Zeit in ms seit dem ersten Aufruf.

    static int i_ResetPrecisionTime;
    
      union ut_LargeInteger
        {
        LARGE_INTEGER o_WinPart;
        __int64       l_MyPart;
        };
    
      static __int64 l_PerfFrequ;
      static ut_LargeInteger uo_PerfCount;
    
      long queryPrecisionTime ()
        {
        if (i_ResetPrecisionTime == 0)
          {
          i_ResetPrecisionTime = 1;
          QueryPerformanceFrequency (& uo_PerfCount. o_WinPart);
          l_PerfFrequ = uo_PerfCount. l_MyPart / 1000;
          QueryPerformanceCounter (& uo_PerfCount. o_WinPart);
          }
    
        ut_LargeInteger uo_perfCount;
        QueryPerformanceCounter (& uo_perfCount. o_WinPart);
        return (long) ((uo_perfCount. l_MyPart - uo_PerfCount. l_MyPart) / l_PerfFrequ);
        }
    


  • Könntest du den Code ein wenig erklären (Was was macht und wo was hin mus)?????



  • In irgendein Headerfile kommt die Funktionsdeklaration:

    long queryPrecisionTime ();
    

    Der vorhin gezeigte Code kommt in irgendein Sourcefile. Man benötigt windows.h zum Compilieren.
    Beim ersten Aufruf liefert die Funktion Null. Bei jedem weiteren Aufruf liefert sie die verstrichene Zeit seit dem ersten Aufruf in MilliSec. Durch Differenzbildung kann man die verstrichene Zeit zwischen zwei Aufrufen ermitteln.
    Die statische Variable i_ResetPrecisionTime dient dem Erkennen des ersten Aufrufs. Mit QueryPerformanceFrequency wird die Taktfrequenz der CPU abgefragt, d. h. Takte pro Sekunde. Mit QueryPerformanceCounter erhält man einen Zähler, der bei jedem CPU-Takt inkrementiert wird. Takte / Frequenz ergibt die Zeit in Sekunden. Deshalb wird die Zeit beim Initialisieren durch 1000 dividiert. Nun bekommt man MilliSec.

    OK ?



  • Danke für die Hilfe.
    Ich werde es nacher ausprobieren.



  • Wenn ich die Funktion aufrufen will kommt folgender Linker Error 😕 :

    QueryPerformanceCounter error LNK2019: Nicht aufgeloestes externes Symbol "public: long __thiscall CQueryPerformanceCounterDlg::queryPrecisionTime(void)" (?queryPrecisionTime@CQueryPerformanceCounterDlg@@QAEJXZ), verwiesen in Funktion "public: void __thiscall CQueryPerformanceCounterDlg::OnBnClickedStart(void)" (?OnBnClickedStart@CQueryPerformanceCounterDlg@@QAEXXZ)

    Was bedeutet das????????????????????????????



  • Die Linkermeldung deutet darauf hin, daß die Funktion in einer Klasse (CQueryPerformanceCounterDlg) deklariert und außerhalb der Klasse definiert wurde. Bei der Definition im C-File bitte angeben: CQueryPerformanceCounterDlg::queryPrecisionTime.



  • Danke.
    Das wars. Funktioniert problemlos.

    mfg
    Fink Christoph

    P.S.: Habe nichts über solche Timer (bzw. Counter) in der FAQ gefunden -> man könnte diesen in die FAQ geben.


Anmelden zum Antworten