2013-07-21 14 views
6

Windows XP'yi hedefliyorum ve taşma yapmayan GetTickCount64'e benzer bir işleve ihtiyacım var.İş parçacığı güvenli Windows XP için GetTickCount64 uygulaması

Doğru ve iplik güvenli, iyi bir çözüm bulamadım, bu yüzden kendi kendime rulo çalıştı. Gerçekten parçacığı güvenli mi

ULONGLONG MyGetTickCount64(void) 
{ 
    static volatile DWORD dwHigh = 0; 
    static volatile DWORD dwLastLow = 0; 
    DWORD dwTickCount; 

    dwTickCount = GetTickCount(); 
    if(dwTickCount < (DWORD)InterlockedExchange(&dwLastLow, dwTickCount)) 
    { 
     InterlockedIncrement(&dwHigh); 
    } 

    return (ULONGLONG)dwTickCount | (ULONGLONG)dwHigh << 32; 
} 

:

Burada ile geldi ne?

İplik emniyeti doğruluğunu kontrol etmek zordur, bu yüzden her durumda gerçekten doğru olup olmadığından emin değilim.

Windows'ta
+4

Hayır, bu evreli değil. –

+1

Bu doğru değil. 'InterlockedIncrement' aramanız en iyi ihtimalle bir tahmindir. Ayrıca, başka bir şey ifade etmek için 'volatile' kullanıyor görünüyorsunuz: [volatile vs. volatile] (http://www.drdobbs.com/parallel/volatile-vs-volatile/212701484). – IInspectable

+0

Yorumlarınız için teşekkür ederiz. Sanırım kilitlenmeyen programlama hakkında bir iki şey öğrenemedim. Peki, ben denedim :) Aslında, benim sorunumu başka bir şekilde çözdüm ... Hiçbir şey yapmadan :) İki GetTickCount sonucu arasındaki fark hesaplanırken, 49 günlük taşma sonuçları gerçekten bozmaz gibi görünüyor. (zaman farkı büyük değilse). http://stackoverflow.com/a/3692425/2604492 – Paul

cevap

4

QueryPerformanceCounter() işlevlerini yerine GetTickCount() kullanılarak genellikle (oyunlarda) çözüldü içinde zamanlayıcı taşma sorunu: saniyeye döngülerini dönüştürmek Sonra saniyedeki devir karşılıklı sayısına göre bu sayıyı çarpabilirsiniz

double GetCycles() const 
{ 
    LARGE_INTEGER T1; 
    QueryPerformanceCounter(&T1); 
    return static_cast<double>(T1.QuadPart); 
} 

:

double GetSeconds() const 
{ 
    return GetCycles() * RecipCyclesPerSecond; 
} 
:

başlatma sonrasında
void Initialize() 
{ 
    LARGE_INTEGER Freq; 
    QueryPerformanceFrequency(&Freq); 
    double CyclesPerSecond = static_cast<double>(Freq.QuadPart); 
    RecipCyclesPerSecond = 1.0/CyclesPerSecond; 
} 

, bu kod parçacığı güvenlidir

Ayrıca bizim açık kaynak Linderdaum Engine (Windows ve diğer birçok platformlar arasında taşınabilir) tam kaynak kodu kontrol edebilirsin: http://www.linderdaum.com

+0

Cevabınız için teşekkür ederiz. Soruyu mükemmel bir şekilde yanıtlıyor, bu yüzden kabul edildi olarak işaretliyorum, başka bir çözüm bulmamıza rağmen: sadece zaman farklarını hesapladığımdan, 49 günlük taşmanın bir sorun olmadığı ortaya çıkıyor. http://stackoverflow.com/a/3692425/2604492 – Paul

+2

'' QueryPerformanceCounter() '' nin çözümü, 'GetTickCount()' 'ile karşılaştırıldığında nanosaniye kadar daha yüksektir. –

İlgili konular