Funktion die Millisekunden genau ist



  • Naja egal, mir reichen meine 3,5 Millionen Tics pro Sekunde. 😉



  • Danke @ SnorreDev, es funktioniert einwandfrei, und scheint so ungefähr 2 Milliarden Tics pro Sekunde (+-50 % ) zu geben 😮



  • GetTickCount ist auf jeden Fall zu ungenau. Die Genauigkeit liegt bei ca. 15 Millisekunden.

    GetTickCount:

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <math.h>
    #include <stdio.h>
    
    void main(void)
    {
    	unsigned long Old=0;
    	unsigned long New=0;
    
    	while(true)
    	{
    		Old=New;
    		New=GetTickCount();
    		if ((New-Old)!=0) printf("%u",New-Old);
    	}
    }
    

    PerformanceCounter:

    #define WIN32_LEAN_AND_MEAN
    #include <windows.h>
    #include <math.h>
    #include <stdio.h>
    
    class CTimer
    {
    public:
    	CTimer(void);
    	~CTimer(void);
    
    public:
    	void Update(void);
    	void Reset(void);
    
    public:
    	unsigned long GetHours(void);
    	unsigned long GetMinutes(void);
    	unsigned long GetSeconds(void);
    	unsigned long GetMilliSeconds(void);
    
    private:
    	LARGE_INTEGER Frequency;
    	LARGE_INTEGER Start;
    	LARGE_INTEGER Delta;
    };
    
    CTimer::CTimer(void)
    {
    	QueryPerformanceFrequency(&Frequency);
    	QueryPerformanceCounter(&Start);
    	Delta.QuadPart=0;
    }
    
    CTimer::~CTimer(void)
    {
    }
    
    void CTimer::Update(void)
    {
    	LARGE_INTEGER end;
    
    	QueryPerformanceCounter(&end);
    	Delta.QuadPart=end.QuadPart-Start.QuadPart;
    }
    
    void CTimer::Reset(void)
    {
    	Start.QuadPart=Start.QuadPart+Delta.QuadPart;
    	Delta.QuadPart=0;
    }
    
    unsigned long CTimer::GetHours(void)
    {
    	LONGLONG result;
    
    	result=Delta.QuadPart/(Frequency.QuadPart*3600);
    	if (result>0xffffffff) result=0xffffffff;
    
    	return((unsigned long)result);
    }
    
    unsigned long CTimer::GetMinutes(void)
    {
    	LONGLONG result;
    
    	result=Delta.QuadPart/(Frequency.QuadPart*60);
    	if (result>0xffffffff) result=0xffffffff;
    
    	return((unsigned long)result);
    }
    
    unsigned long CTimer::GetSeconds(void)
    {
    	LONGLONG result;
    
    	result=Delta.QuadPart/Frequency.QuadPart;
    	if (result>0xffffffff) result=0xffffffff;
    
    	return((unsigned long)result);
    }
    
    unsigned long CTimer::GetMilliSeconds(void)
    {
    	LONGLONG result;
    
    	result=(Delta.QuadPart*1000)/Frequency.QuadPart;
    	if (result>0xffffffff) result=0xffffffff;
    
    	return((unsigned long)result);
    }
    
    void main(void)
    {
    	unsigned long Old=0;
    	unsigned long New=0;
    
    	CTimer timer;
    
    	while(true)
    	{
    		timer.Update();
    		Old=New;
    		New=timer.GetMilliSeconds();
    		if ((New-Old)!=0) printf("%u",New-Old);
    	}
    }
    

    Wenn man dann was 100 mal pro Sekunde "timen" will, dann reicht GetTickCount nicht aus, da jeder Frame nur 10 ms dauert.



  • spl@t schrieb:

    Danke @ SnorreDev, es funktioniert einwandfrei, und scheint so ungefähr 2 Milliarden Tics pro Sekunde (+-50 % ) zu geben 😮

    Hoffe, es ist hochaufloesend genug fuer deine Ansprueche 😉


Anmelden zum Antworten