北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
查看: 4311|回复: 9

耐人寻味的DoCommand("ReloadScriptFile")

[复制链接]
发表于 2010-4-16 17:13:23 | 显示全部楼层 |阅读模式
mushclient,先在主文件中require "wait",然后你运行如下四段代码,在运行前你会分别知道结果吗?
1.
/DoCommand("ReloadScriptFile"); wait.make(function()   print("AAAAA")   end)

2.
/DoCommand("ReloadScriptFile"); wait.make(function()  wait.time(1)  print("AAAAA")   end)

3.
/DoCommand("ReloadScriptFile"); DoAfterSpecial(0.1, 'wait.make(function()  wait.time(1)  print("AAAAA")   end)', 12)

4
/wait.make(function() DoCommand("ReloadScriptFile"); wait.time(1);  print("AAAAA")   end)

所以在程序中,倒底怎么样使用这个DoCommand("ReloadScriptFile")才是正确的呢?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2010-4-16 17:15:47 | 显示全部楼层
在第一段和第三段代码中,会打印出AAAA

在第二段和第四段代码中,不会打印出AAAA
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-4-16 17:40:22 | 显示全部楼层
说一下我的理解:

1. 虽然使用了wait.make()但实际上没有进程,直接被执行。

2. 使用了wait.make()并在其中使用了wait.time()进程被创建,但由于之前使用了DoCommand("ReloadScriptFile"),脚本引擎都被重置了,进程被冲毁。

3. DoAfterSpecial() 实际上是Timer与脚本引擎无关。

4. 同2。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-4-16 17:53:59 | 显示全部楼层
参考 MUSHClient Documentation
http://www.gammon.com.au/scripts/doc.php?command=ReloadScriptFile

[size=-1]ReloadScriptFile
Summary
Forces script source file to be reprocessed
Menu
Game -> Reload Script File
Keyboard Shortcut
Shift+Ctrl+R
Example of script call
world.DoCommand "ReloadScriptFile"
Details
This causes the script file associated with this world to be recompiled.

You should do this after correcting any syntax errors which have been reported in your script.

Reloading the script file also re-initializes the script engine, thus clearing any variables which were established during a previous script execution.

In the case of Lua scripts it also causes the Lua 'sandbox' to be re-executed.
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2010-4-16 18:03:27 | 显示全部楼层
楼上说的很有道理,但是在实践中,我发现使用DoAfterSpecial(1,'xxx()',12)这种方法,有时也不会执行脚本xxx(),而引起rbt发呆。

并且我认为在第一段中,wait.make会调用coroutine.wrap创建线程,线程应该是被创建起来了。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-4-16 18:06:48 | 显示全部楼层
  1. coroutine.wrap (f) () -- make coroutine, resume it
复制代码


一个单一的进程,从未被挂起过,一直执行到底。

——这和没有进程没什么区别呀。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-4-16 18:11:41 | 显示全部楼层
原帖由 myu 于 2010-4-16 18:03 发表
楼上说的很有道理,但是在实践中,我发现使用DoAfterSpecial(1,'xxx()',12)这种方法,有时也不会执行脚本xxx(),而引起rbt发呆。


这个,一般不会吧。最好打开LOG,再打开Trace,发现有这种情况后,分析LOG。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2010-4-17 09:24:09 | 显示全部楼层
我在担心DoCommand("ReloadScriptFile")后紧接着执行另一个调用时。这里面是不是有个时间差,会导到另一个调用开始时,这个Reload动作还没有完成。换句话说,DoCommand("ReloadScriptFile"),会不会等到Reload完成后才执行下一条指令。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-4-17 10:54:19 | 显示全部楼层
现在看来,你所担心的事,正在发生……
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2010-4-17 11:04:52 | 显示全部楼层
从Details看,ReloadScriptFile至少做了3件事,脚本重编译、脚本引擎重置、lua沙箱重置。

如果你的脚本足够大,重编译肯定需要些时间。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-24 07:10 PM , Processed in 0.010059 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表