SORU
15 Kasım 2009, Pazar


QueryPerformanceCounter nasıl kullanılır?

Geçenlerde Zamanlayıcı Dersim için mikrosaniye kullanarak milisaniye arasında değiştirmem gerektiğine karar verdim ve biraz araştırma yaptıktan sonra QueryPerformanceCounter muhtemelen güvenli bir bahis olduğuna karar verdim. (Not Mayıs Boost::Posix uyarı Win32 API beni biraz ertelendi) çalışır. Ancak, gerçekten bunu uygulamak için nasıl emin değilim.

Ne yaptığımı ve Timer kullanmadan atıyorum GetTicks() vari fonksiyonu startingTicks değişken ne olursa olsun arıyor. Daha sonra bu süreyi bulmak için sadece startingTicks, işlevin dönüş değeri çıkarmak ve ben sadece çağrı zamanlayıcı fonksiyonu tekrar reset ve startingTicks atama geçti. Ne yazık ki, gördüğüm kod sadece QueryPerformanceCounter(), arama kadar basit değil ve bağımsız değişken olarak geçmek için ne yapacağım, emin değilim.

CEVAP
15 Kasım 2009, Pazar


#include <windows.h>

double PCFreq = 0.0;
__int64 CounterStart = 0;

void StartCounter()
{
    LARGE_INTEGER li;
    if(!QueryPerformanceFrequency(&li))
	cout << "QueryPerformanceFrequency failed!\n";

    PCFreq = double(li.QuadPart)/1000.0;

    QueryPerformanceCounter(&li);
    CounterStart = li.QuadPart;
}
double GetCounter()
{
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart-CounterStart)/PCFreq;
}

int main()
{
    StartCounter();
    Sleep(1000);
    cout << GetCounter() <<"\n";
    return 0;
}

Bu program, bir sayıyı 1000'e yakın çıkışı (uyku bu doğru değil, ama 999 gibi olmalıdır windows).

Bu StartCounter() kayıtları kene sayısı performans sayacı CounterStart değişken olan fonksiyon. Bu GetCounter() işlevi bu yana geçen milisaniye sayısı StartCounter() son olarak bir çift, eğer öyleyse GetCounter() döndürür hassasiyeti 0,001 sonra oldu yaklaşık 1 mikrosaniye beri StartCounter() çağrıldı.

Eğer zamanlayıcı saniye yerine kullanmak istiyorsanız, o zaman değiştirin

PCFreq = double(li.QuadPart)/1000.0;

için

PCFreq = double(li.QuadPart);

veya mikrosaniye zaman isterseniz kullanın

PCFreq = double(li.QuadPart)/1000000.0;

Ama gerçekten bir çift verir bu yana yaklaşık kolaylık.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bigapplemagic

    Bigapplemagi

    22 EYLÜL 2011
  • POGProductionz

    POGProductio

    27 NİSAN 2012
  • wowchick16

    wowchick16

    17 Mart 2007