望call_out表现比较正常,那最好把hb设为1秒(1000000微秒);否则hb越大,callout的表现就越奇怪。hb非整秒数则会带来其他更微妙的改变。。。。
 
 
 
 
 
    最后,关于call_out(foo,0)这个特例。
 
    一般来说,我们无法期待这个东西立刻执行。他可能会在下一次hb的时候才被执行。
 
    之所以用“可能”,是因为这个特例还有个更奇怪的特例。该call_out本身处于另外一个call_out的呼叫函数当中。因此这个call_out进行的记录插入动作本身就是在call_out执行点上。可想而知,他立刻就被执行了!!!
 
 
 
    我们举两个例子来说明吧:
 
    我们假设hb是10个seconds。查看这样一段函数:
 
void test()
 
{
 
        call_out("test_callout",0);
 
}
 
 
 
void test_callout()
 
{
 
        tell_object(this_object(),sprintf("CO:%d\n",time()));
 
        call_out("test_callout",0);
 
}
 
 
 
当我们以某种形式执行了test()的时候,会出现什么状况呢?
 
首先是test()中的:call_out("test_callout",0)被执行,插入了一条记录,这个记录应当被触发的时间点是current_time+0。(我们假设current_time是333秒吧)
 
但考虑到hb点还没到。这个时候我们什么都看不到。
 
等到下一个hb点,也许作为现实时间,是337秒的时候吧(举例)。
 
上次插入的callout被执行了!
 
因此我们收到一条CO:333的显示信息(因为current_time这个时候还没++完呢)
 
接下来就坏掉了,因为又一个call_out("test_callout",0)被执行了!
 
要注意,这一条call_out插入的触发时间点依然是current_time+0,也就是333。
 
这时这个test_callout函数被执行完,退出,回到系统的call_out执行循环当中。
 
坏掉了,系统发现在333这个时间点上还有个未处理的记录(刚插进去的。。)
 
于是进入了死循环。。。
 
我们会看到系统不断刷屏CO:333
 
CO:333
 
CO:333
 
CO:333
 
。。。。
 
死循环下去了。
 
 
 
上面这个例子表明,callout 0是否立刻被执行,要看他所处的环境,不能一概而论,即时hb是1也如此。
 
 
 
再来一个例子:
 
同样hb是10seconds。
 
 
 
void test()
 
{
 
        call_out("test_callout",0);
 
}
 
 
 
void test_callout(){
 
        tell_object(this_object(),sprintf("CO:%d\n",time()));        call_out("test_callout",1);
 
}差别是后一个call_out的delay是1。
 
 
 
不详细描述了,我们得到的结果应该是类似:
 
系统等待发呆。。。。一次性刷屏:
 
CO:333
 
CO:334
 
CO:335
 
CO:336
 
CO:337
 
继续等待发呆个10秒。。。一次性刷屏:
 
CO:338
 
CO:339
 
CO:340
 
CO:341
 
CO:342
 
CO:343
 
CO:344
 
CO:345
 
CO:346
 
CO:347
 
等待。。。刷屏。。。等待。。。刷屏。。。。
————————————————
版权声明:本文为CSDN博主「回到未来望过去」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/viviliving/article/details/100553285

上一页
返回列表
返回首页
©2024 MUD游戏网_文字mud 电脑版
Powered by iwms