Bu c++ non blocking timer class ile, belirli bir saniyede bir işlemleri yaptırabilmek çok kolay. Örneğin, her 10sn’de bir işlem yaptırmak, her 2sn’de bir labeli güncellerken, her 632 milisaniyede bir textbox’a yazı yazmak daha kolay. Gettickcount ile uzun uzun uğraşmamak adına, kolaylık olsun diye yazılmış bir classtır.
Aşağıdaki şekilde kod yazdığımız zaman program satır satır ilerliyor fakat classtaki kodlar kullanılırsa kitlenme olmuyor. Ornekler mevcuttur.
1 2 3 4 |
Sleep(1000) yaziyaz("1 sn geçti.") Sleep(500) yaziyaz("1.5sn geçti") |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <windows.h> #ifndef uint64_t #include <stdint.h> #endif class nonblockingtimer { public: nonblockingtimer(uint64_t timeout = 0) { tnow = GetTickCount64(); timeoutvalue = timeout; } uint64_t elapsed() { return GetTickCount64() - tnow; } // Hom many ms passed. bool istimeout() { return (GetTickCount64() - tnow > timeoutvalue); } // is time out? void reset() { tnow = GetTickCount64(); } // reset nowtime. void settimeout(uint64_t timeout) { timeoutvalue = timeout; } // set new timeout. private: uint64_t tnow, timeoutvalue; }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
// örnek 1 nonblockingtimer tmr(1000); // bu kodu tanımlar tanımlamaz, şu anki zaman tutulup, 1000 milisaniye sonrasını zaman durdurma noktası olarak kayıt ediyoruz. while (1) { if (tmr.istimeout()) break; } ShowMessage("1sn doldu"); // sadece borlandda çalışır dikkat! // örnek 2 nonblockingtimer tmr2; while (1) { if (tmr2.elapsed() > 500) break; } ShowMessage(IntToStr((int)tmr2.elapsed()) + " kadar zaman sonra while'dan cikildi"); // örnek 3 nonblockingtimer tmr3(3000); while (1) // sonsuz döngü. { if (tmr3.elapsed() > 500) { // 500ms geçti. } if (tmr3.elapsed() > 1000) { // 1000 ms geçti } if (tmr3.istimeout()) { // 3sn geçmiş loopdan çıkalım break; } } // örnek , önce 2sn bekle, sonra 1sn daha bekle ve döngüden çık. nonblockingtimer tmr4; while (1) // sonsuz döngü. { if (tmr4.elapsed() > 2000) { tmr4.settimeout(1000); continue; // aşağıdaki 1000lik yere gitmesin. } if (tmr3.elapsed() > 1000) { // 2000ms'den sonraki 1000 ms geçti donguden çık. break; } } // örnek 5, kendini her 500 milisaniyede bir tekrarlar. Hiç durmaz. nonblockingtimer tmr5(500); while (1) { if (tmr5.istimeout()) { tmr5.reset(); } } // örnek 6 //önce 1sn, sonra 2 sn, sonra 3 sn, sonra 4sn geçince işlemler yapar. 4.sn de bitirir. nonblockingtimer tmr6(4000); while (1) // sonsuz döngü. { if (tmr6.istimeout()) { break; // 4000ms geçti. } else if (tmr6.elapsed() > 3000) { // 3000 ms geçti } else if (tmr6.elapsed() > 2000) { // 2000 ms geçti } else if (tmr6.elapsed() > 1000) { // 1000 ms geçti } } |