C++11标准stl库的timer
timer定时器,多线程,回调为阻塞模式。支持参数绑定,非常好使。
用法:
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 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 | ////////////////////////////////////////////////////////////////////////// //以下是测试代码 namespace timertester { class timertestclass { public : timertestclass(){}; ~timertestclass(){}; void testfn() { printf ( "timer callback is class func.\n" ); FTimerEvent mTimer(3000, &timertestclass::threadfn, this ); for ( int i = 0; i < 5; i++) { printf ( "press any key to ...\n" ); getchar (); mTimer.SetTimerEvent(); } printf ( "stop timer \n" ); mTimer.StopTimer(); } void threadf( int i) { printf ( "test f i:%d\n" , i); } void threadfn() { printf ( "test fn d\n" ); } void threadfn2() { printf ( "test fn2222 \n" ); } }; static void testfn1(timertestclass *cls) { cls->threadfn(); } static void testpf() { printf ( "test printf \n" ); printf ( "callback ret. \n" ); } static void prt( int & i) { printf ( "print %d\n" , i); } static void timertest() { int t = 0; FTimerEvent timerstdref(1000, prt, std::ref(t)); for ( int i = 0; i < 10; i++) { t = i; Sleep(1000); } timerstdref.StopTimer(); { printf ( "timer 0 manual to set\n" ); //如果定时为0,则每次为手动触发 FTimerEvent timerman(0, [](){ printf ( "timerman in.\n" ); Sleep(5000); printf ( "timerman out.\n" ); }); timerman.SetTimerEvent(); timerman.SetTimerEvent(); timerman.StopTimer(); } printf ( "stop timer in callback\n" ); FTimerEvent timer4; timer4.InitTimer(1000, [](FTimerEvent *pTimer){ printf ( "exit timer\n" ); pTimer->StopTimer(); }, &timer4); Sleep(3000); timer4.StopTimer(); printf ( "set timer in callback\n" ); FTimerEvent timer5; timer5.InitTimer(2000, [](FTimerEvent *pTimer){ static bool set = false ; printf ( "timer in\n" ); if (!set) { printf ( "set timer\n" ); pTimer->SetTimerEvent(); set = true ; } printf ( "timer out\n" ); }, &timer5); Sleep(10000); timer5.StopTimer(); timertestclass test1; test1.testfn(); int x = 0; FTimerEvent timerref(1000, [&x]() { printf ( "x: %d \n" , x); }); for ( int i = 0; i < 10; i++) { x = i; Sleep(1000); } timerref.StopTimer(); FTimerEvent timerx(1000, [&test1]() { test1.threadfn2(); }); Sleep(10000); timerx.StopTimer(); FTimerEvent timer0(1000, testpf); Sleep(10000); timer0.StopTimer(); FTimerEvent timer1(1000, testfn1, &test1); Sleep(10000); timer1.StopTimer(); FTimerEvent timer2(1000, [](){ printf ( "lambada no param \n" ); }); Sleep(10000); timer2.StopTimer(); int param = 0; FTimerEvent timer3(1000, []( int *p){ printf ( "lambada with param: %d \n" , *p); }, ¶m); Sleep(10000); timer3.StopTimer(); } } |
blackfeather 2020/9/7 2431℃ 0评论