‘GetTickCount64’ Etiket Arşivi

49.7 gün sonra GetTickCount !

// 6 Haziran 2009 // 3 Yorum » // Delphi, İşletim Sistemi, Programlama, Win32

Eğer sizlerde projelerinizde zamansal kontroller kullanıyorsanız, iki kod sürecinin arasındaki zaman dilimini hesaplıyorsanız muhtemelen GetTickCount API’sini kullanıyorsunuz demektir. Bu API, işletim sistemi açıldığı zaman sıfır(0)’a eşitlenen ve her milisaniyede bir değeri bir arttırılan işletim sistemine has bir değişkenin değerini bizlere geri verir. Win32 API Help’te tanımı aşağıdaki gibidir:

DWORD GetTickCount(VOID)

Görüldüğü üzere geri dönüş değeri DWord türünde. Delphi’de DWord, LongWord türüne eşitlenmiştir. LongWord ise 32 bit işaretsiz bir tamsayıdır. Yani bu sayının alabileceği değer aralığı; 0..4.294.967.295 dır. Bu değerlerin doğruluğunu aşağıdaki kod ile de kontrol edebilirsiniz:

var
  dw : DWord;
begin
  dw := Low(DWord);
  ShowMessage(InttoStr(dw));

  dw := High(DWord);
  ShowMessage(InttoStr(dw));
end;

Hatırlarsanız eğer, GetTickCount API’sinin her milisaniyede bir işletim sistemi içinde bir yerde bulunan bir değişkenin değerini bir arttırdığını ve bu değeri geri döndürdüğünü söylemiştik. Peki; 4.294.967.295 + 1 milisaniye sonra ne olacak ? İsterseniz bu milisaniyenin kaç güne tekabül ettiğine önce bir bakalım;

  • 4.294.967.295 ms = 4.294.967.295 ms / 1000 = 4.294.967,295 sn.
  • 4294967,295 sn = 4294967,295 sn / 60 = 71.582,78825 dk.
  • 71.582,78825 dk = 71.582,78825 dk / 60 = 1.193,04647083 saat
  • 1.193,04647083 saat = 1.193,04647083 saat / 24 = 49,71 gün
  • Gördüğünüz gibi 49.7 gün sonra GetTickCount API fonksiyonu uygulamamız için tehlike sinyalleri vermeye başlayacaktır. 49.7 günün sonunda işletim sistemindeki değişken maksimum değerine erişecek ve bir sonraki milisaniyede bu değişken otomatikman sıfırlanacaktır. Dolayısı ile yapacağımız zamansal kontroller hatalı neticeler üretecek, belkide beklemediğimiz durumlar ile karşılaşacağız.

    Peki ne yapmalıyız ? Aslında yapılabilecek şeyler sınırlı, ama ben size QueryPerformanceCounter‘a bakmanızı yada Vista işletim sistemi kullanıyorsanız GetTickCount’un 64 bit değer döndüren ve kernel32.dll içinde tanımlanmış ancak Delphi’de implemente edilmemiş GetTickCount64 fonksiyonunu kullanmanızı önerebilirim.

    49.7 gün bir bilgisayar açık kalmaz, benim programım da 49.7 gün sürekli açık kalacaksa patlarsa patlasın derseniz o zaman bu hususlara bakmayabilirsiniz tabii :)

    Saygılar, sevgiler..