1 package main
2
3 import (
4 "fmt"
5 "time"
6 )
7
8 func Timer_stop(t *time.Timer) {
9 if nil != t {
10 t.Stop()
11 }
12 }
13
14
15 func Timer_interval(delay_ms int, interval_ms int, fn func() ) *time.Timer {
16 fmt.Printf("Timer_interval delay_ms=%d, interval_ms=%d\n", delay_ms, interval_ms)
17 t:= time.NewTimer(time.Duration(delay_ms) * time.Millisecond)
18 go timer_interval_do(t, fn, interval_ms)
19
20 return t
21 }
22
23 func timer_interval_do(t *time.Timer, fn func(), interval_ms int) {
24 for {
25 select {
26 case <- t.C:
27 fmt.Println("timer_do timer triggered")
28 t.Reset(time.Millisecond * time.Duration(interval_ms))
29 fn()
30 }
31 }
32 }
33
34 func Timer_once(delay_ms int, fn func() ) *time.Timer {
35 fmt.Printf("Timer_interval delay_ms=%d\n", delay_ms)
36 t:= time.NewTimer(time.Duration(delay_ms) * time.Millisecond)
37 go timer_once_do(t, fn)
38
39 return t
40 }
41
42 func timer_once_do(t *time.Timer, fn func()) {
43 for {
44 select {
45 case <- t.C:
46 fmt.Println("timer_do timer triggered")
47 t.Stop()
48 fn()
49 }
50 }
51 }
52 /////////////////////////////////////////////////////// 以下是测试用例
53 var mydo_is_doing = 0
54
55 func mydo_thread() {
56
57 mydo_is_doing = 1
58
59 for i:=0; i < 20; i += 1 {
60 fmt.Printf("timer doing, %d\n", i)
61 time.Sleep(1*time.Second)
62 }
63
64 mydo_is_doing = 0
65 }
66
67 func mydo() {
68 fmt.Println("mydo timer triggered")
69
70 if 0 != mydo_is_doing {
71 fmt.Println("mydo timer is doing, ignore this")
72 return
73 }
74
75 go mydo_thread()
76 }
77
78 func mydo_once() {
79 fmt.Println("mydo_once timer triggered")
80 for i:=0; i < 20; i += 1 {
81 fmt.Printf("timer_oncccccccccccccccccccccce doing, %d\n", i)
82 time.Sleep(1*time.Second)
83 }
84 }
85
86 func main() {
87 t:=Timer_interval(2000, 5000, mydo)
88 t2:=Timer_once(3000, mydo_once)
89 fmt.Println("####################1")
90 time.Sleep(13*time.Second)
91 fmt.Println("####################2")
92 Timer_stop(t2)
93 Timer_stop(t)
94 fmt.Println("####################3")
95 time.Sleep(50*time.Second)
96 fmt.Println("####################4")
97
98
99 }
100
101 /////////////////////////////////////////////////////// 以上是测试用例