sghjjj 发表于 2009-8-17 10:23:11

恩,真的写错了,ttk_42 ,我去改下

zgbl 发表于 2009-8-17 10:30:08

原帖由 tempxx 于 2009-8-17 10:17 发表 http://pkuxkx.com/forum/images/common/back.gif
那么就是教程里有瑕疵了,你看#alias Testidle {#alarm +@time {#if (@idle>0) {#say 运行情况良好;#var idle 0} {#say 机器人已经中断;let it run}};testidle}
他最后的testidle是在#alarmtime {} 之外的


最 ...
貌似是版本问题
这种判定,zmud可能有两种解释
1、#alarm运行,@time后执行指令,加入这个状态后就认为#alarm执行完毕,马上执行testidle,这样就像糖果刚才回复的,会死循环,因为testidle没有延迟,不停重复
2、#alarm运行,@time后执行指令,直到@time之后zmud才认为#alarm执行完毕,然后执行testidle,这样判定的话这个写法就是可行的

安全起见,testidle还是写在{}内吧

我知道的是,在462里,#wa 5000;command;testidle肯定是5s后执行,不过这是废话
但是如果再命令栏里输入path,path中有延时,比如去华山村的是
xiaocun=do 5 n;nw;#wa 1000;do 4 n
而你如果输入xiaocun;hi,回车,其实zmud的执行时do 5 n;nw;hi;#wa 1000;do 4 n
意思是在zmud462的命令行判定中,xiaocun开始进入执行状态后,zmud462就认为xiaocun执行结束,马上执行了hi,后果就是hi被插到了path里,我做慕容时经常beijingb;s;s;w;l,如果用命令栏,s;s;w;l就会插到beijingb里导致行走错误
但是,令人无语的是,如果path;command这种格式放到触发指令里,却是可行的,一直到path整个执行完才会执行command,无语

所以,找这个判定推测,如果是在{}外的话,462会导致死循环,因为testidle是用别名执行而不是用触发器执行,别名执行相当于就是在输入栏里直接输入回车,那么后果就是结果1

不知道推断正确否,没真的试过这个alarm嵌套

xiaofei 发表于 2009-8-17 13:28:12

搞那么复杂干啥呀,在timer里设一个就好了!

chengsan 发表于 2009-8-20 22:19:43

我也不明白为什么搞这么复杂,在一个长时间运行的机器人中,反复创建临时tr,会增加很大的系统开销,常规性自身调用,也会增加不稳定因素,甚至造成内存混乱。其目的无非是尽量降低发呆的时间。其实发呆本身就是非常规现象,那么遇到了多等几秒也无所谓。
简单的一行 #alarm -10 {hi} 创建一个永久运行的定时器。比ts的好处是程序集成度高,不争抢那唯一的ts。
如果非要自动控制,那么在开始的时候创建,任务结束了#untrigger删除就是了。

xiaoxiaoxue 发表于 2009-8-20 22:39:50

可以用time功能防止退出嘛


比如#time 60 5 kiss littlexi

sghjjj 发表于 2009-8-20 23:31:19

诚三你说的#untr -10的特点只有721才有,如果用的是721,绝对是用#untr -10,一个永久性的定时器肯定比反复的嵌套创建要好

另外timer只有1个,如果在某个更重要更需要稳定的地方已经用了timer,那么防发呆就只能用#alarm了。timer比#alarm简单稳定。

我一直还是主张能简单尽量不要复杂的。
页: 1 [2]
查看完整版本: 请教#alarm的一个疑问