uEngine4 Serüveni – Zamanlayıcılar

Merhaba sevgili yazılımperver dostlarım. Bugünkü yazımda, uEngine4 içerisinde sessiz sessiz duran bir proje hakkında yazıyor olacağım: “time”. İsminden de anlaşılacağı üzere, bu proje içerisinde, projelerinizde ihtiyaç duyabileceğini bir çok zamanlayıcı, ölçüm ve benzeri araçları bulabilirsiniz. Mevcut uEngine içerisinde de, bu sınıfları kullanıyor olacağım. Ayrıca, bunların bir kısmına çeşitli yazılarımda da yer vermiştim. Yazıların bağlantılarını da ekliyor olacağım.
Uzun bir süre önce, zamanlayıcılar ve benzeri araçların bir çoğu için platformlara (işletim sistemleri) özgü kütüphane ve yaklaşımları kullanmak zorundaydık. C++ 11 ile artık bunların bir çoğunu, standart olarak sunulan API’leri kullanarak gerçekleştirebiliyoruz. Elbette bir adım öteye gitmek istediğimiz zaman platforma özgü bir takım kütüphane ya da API’leri kullanmamız gereken durumlar oluyor ama çoğunlukla standart araçlar işiniz görecektir. Aşağıya C++ 11 ile sunulan std::chrono yazılarımı ekliyorum, devam etmeden göz atmanızda fayda olabilir:
Bu sınıflara ilişkin kaynak kodlara aşağıdaki adresten ulaşabilirsiniz:
O zaman daha fazla vakit kaybetmeden sınıflara göz atalım.

Timestamp

Bu sınıf, sizlere anlık zamana ilişkin çeşitli bilgileri sunan statik API’lerden oluşmaktadır.
Temel olarak sunulan API’ler ve işlevleri şu şekilde:

ChronoUtil

Bir önceki sınıfa benzer şekilde, C++ 11 ile sunulan üç temel zamanlayıcı kavramı olan süre, saat ve zaman noktası kabiliyetlerini kullanarak, zamana ilişkin çeşitli bilgilerin sunulması amacı ile kullanılabilecek sınıftır (sınıfa ve ilgili kavramlar için https://www.yazilimperver.com/index.php/2021/08/16/haftalik-c-39-stdchrono-2-clocks-time_point/ yazıma göz atabilirsiniz).
Sınıf ile sunulan API’ler ise aşağıdaki gibidir:

StopWatch

Bu sınıf ise, uygulamalarınız içerisinde ihtiyaç duyacağınız ölçüm işleri için kullanılabilecek API’leri sunmaktadır. Bunu da yaparken, C++ 11 ile sunulan std::chrono kütüphanesini kullanır. Sunulan API’ler şu şekildedir:

SleepUtil

Bu sınıf Windows ve diğer sistemler için hassas bekleme API’leri sunan bir sınıftır. Temelde iki API sunmaktadır.

bunlardan ilki Windows API’lerini kullanarak, hassas bekleme işlevi sizlere sunar. Bunu da yaparken 100 nanosaniye seviyelerinde girdileri destekler ve SetWaitableTimer API’si kullanılır (https://learn.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-setwaitabletimer). Bu API sizlere milisaniye ve 100 nanosaniye çözünürlüklerde, haber veren zamanlayıcılar ayarlamanıza olanak sağlar.

İkinci API ise, sizlere platformunuzdan bağımsız olarak “Welford” algoritmasını kullanarak bir bekleme fonksiyonalitesi sunar.
Bu algoritma temelde işlemci kullanımı ile zamanlayıcı hassasiyetini dengeler. Detaylar için https://www.wikiwand.com/en/Algorithms_for_calculating_variance#/Welford’s_online_algorithm‘na göz atabilirsiniz.

FPSTimer

Bu sınıf, özellikle oyun ve grafiksel uygulamalarda, saniyede çizilen sahnelerin miktarını kontrol etmek için kullanmanıza olanak sağlayan bir sınıftır. Detaylar için https://www.yazilimperver.com/index.php/2017/12/09/oyun-donguleri/ yazıma göz atabilirsiniz. SdlApplication içerisinde de kullanımını görebilirsiniz.

ThreadedTimer

Evet, zamana bilgilerini görüntüleme, bekletme ve ölçmeye ilişkin servisleri sunan sınıflara göz attıktan sonra, sıra geldi gerçekten zamanlayıcı kabiliyetini sunan bir sınıfa göz atmakta. Peki, ne kast ediyorum? Basitçe, belirli bir süre sonra beni haberdar eden ya da vereceğim bir sürede bir beni haberdar edecek basit ve modern bir araç.
Öncelikle bunu yapmanıza olanak sağlayacak, platform bağımlı API’ler bulunmak ile birlikte, bu sınıfta aslında, temel C++ sınıflarını kullanarak bunu nasıl yapabileceğimiz göreceksiniz ki bu da aslında ayrı bir thread içerisinden bunu takip etmek olacak (not: bunu milyon tane farklı yöntemi olabileceğinin farkındayım, bu sınıfın onlardan birisi olduğunu kabul edebilirsiniz, diğerleri için https://letmegooglethat.com/?q=c%2B%2B+timer+example)
Bu sınıf ile sunulan API’ye aşağıdan ulaşabilirsiniz:

Burada ilk aklınıza takılan function kullanımı olabilir. Bunun yerine, bu sınıfa ya da API’lere IListener tarzında bir arayüz geçirerek de, ilgili sınıfı haberdar edebilirsiniz. Ben ise bu halini kullanacağım.

StoppableTimer

Evet, yazımda değineceğim son zamanlayıcı sınıf bu olacak. İsminden de anlayacağınız üzere, durdurulabilir bir zamanlayıcı kabiliyeti sunan bir sınıf. Bu noktada, bir dakika yazılımperver, bir önceki sınıf zaten bunu sunmuyor muydu? diye sorabilirsiniz. Dikkatli okuyucularım, ilgili sınıfın bunu sunmadığını görecekler. Tek atımlık zamanlayıcı ve periyodik API’ler için zamanın dolmasını beklemek zorundasınız, neden peki? Çünkü bizim takip ettiğimi yaklaşım için (uyutmak) bu mümkün olmuyor, fakat platforma özgü API’ler için bu mümkün olabilir. Peki bunu nasıl kotarabiliriz?
Yardım çok uzakta değil, “condition variables” 🙂 Evet, condition variables ile sunulan ve belirli bir süre beklemeye olanak sağlayan wait_for API’si bizim için biçilmez bir kaftan (bu konuya ilişkin yazım için ise bağlantısına göz atabilirsiniz).
Bu API hem bekleme işlevini sunuyor hem de durdurmak istediğimizde, geçirdiğimiz predicate sayesinde beklemeyi de sonlandırmaya olanak sağlıyor. Aşağıya ilgili API’nin nasıl kullanıldığını görebilirsiniz:

durdurmak için de:


API’sini çağırmanız yeterli.

Bu sınıf içerisinde periyodik API’yi eklemedim ama isterseniz bunu eklemek bir önceki sınıfa bakarak zor olmayacaktır.
Evet sevgili dostlar, bu yazımda, uEngine4 ile sunulan zamanlayıcı ile ilgili sınıflara bir bakış atmış olduk. Bundan sonra, bir yazımı da, boost tarafından sunulan zamanlayıcılara ayırmayı planlıyorum. O zamana kadar bol kodlu günler 🙂

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.