NASAL脚本实现的高精度定时器

时间:2021-11-29 08:52:22
 1 #timer thread
2
3 #-------以下:用户禁止访问-------
4 #定时器属性
5 var TimerHash =
6 {
7 #定时间隔
8 time : 1,
9 #触发函数
10 trigFunc : nil,
11 #是否取消
12 cancel : 0,
13
14 new : func (_time, _trigFunc, _cancel)
15 {
16 return { parents:[TimerHash],
17 time : _time,
18 trigFunc : _trigFunc,
19 cancel : _cancel
20 };
21 }
22 };
23
24
25 #存放所有的定时器
26 var TimerVec = [];
27
28
29 #定时器工作线程启动函数
30 var thread_timer_id = 0;
31
32 var thread_func = func
33 {
34 var id = thread_timer_id;
35
36 var time1 = systime();
37 var time2 = time1;
38
39 while(!TimerVec[id].cancel)
40 {
41 time2 = systime();
42
43 if ((time2 - time1) >= TimerVec[id].time)
44 {
45 time1 = time2;
46
47 TimerVec[id].trigFunc();
48 }
49 }
50 };
51
52
53 #退出FlightGear时,停止所有的定时器
54 var stop_all_timer = func
55 {
56 for (var i = 0; i < size(TimerVec); i += 1)
57 {
58 TimerVec[i].cancel = 1;
59 }
60 };
61
62 _setlistener("/sim/signals/exit", stop_all_timer);
63 #-------以上:用户禁止访问-------
64
65
66
67
68
69 #-------提供给用户使用的定时器类-------
70 var TimerClass =
71 {
72 #-------以下:用户禁止访问-------
73 id : 0,
74 #-------以上:用户禁止访问-------
75
76 new : func (_time, _trigFunc)
77 {
78 var tm = TimerHash.new(_time, _trigFunc, 0);
79 append(TimerVec, tm);
80
81 return { parents : [TimerClass],
82 id : size(TimerVec) - 1 };
83 },
84
85 start : func
86 {
87 TimerVec[me.id].cancel = 0;
88
89 thread_timer_id = me.id;
90 thread.newthread(thread_func);
91 },
92
93 stop : func
94 {
95 TimerVec[me.id].cancel = 1;
96 }
97 };