myu 发表于 2010-4-16 17:13:23

耐人寻味的DoCommand("ReloadScriptFile")

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")才是正确的呢?

myu 发表于 2010-4-16 17:15:47

在第一段和第三段代码中,会打印出AAAA

在第二段和第四段代码中,不会打印出AAAA

ddid 发表于 2010-4-16 17:40:22

说一下我的理解:

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

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

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

4. 同2。

ddid 发表于 2010-4-16 17:53:59

参考 MUSHClient Documentation
(http://www.gammon.com.au/scripts/doc.php?command=ReloadScriptFile)

ReloadScriptFileSummary
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.

myu 发表于 2010-4-16 18:03:27

楼上说的很有道理,但是在实践中,我发现使用DoAfterSpecial(1,'xxx()',12)这种方法,有时也不会执行脚本xxx(),而引起rbt发呆。

并且我认为在第一段中,wait.make会调用coroutine.wrap创建线程,线程应该是被创建起来了。

ddid 发表于 2010-4-16 18:06:48

coroutine.wrap (f) () -- make coroutine, resume it

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

——这和没有进程没什么区别呀。

ddid 发表于 2010-4-16 18:11:41

原帖由 myu 于 2010-4-16 18:03 发表 http://pkuxkx.net/forum/images/common/back.gif
楼上说的很有道理,但是在实践中,我发现使用DoAfterSpecial(1,'xxx()',12)这种方法,有时也不会执行脚本xxx(),而引起rbt发呆。


这个,一般不会吧。最好打开LOG,再打开Trace,发现有这种情况后,分析LOG。

myu 发表于 2010-4-17 09:24:09

我在担心DoCommand("ReloadScriptFile")后紧接着执行另一个调用时。这里面是不是有个时间差,会导到另一个调用开始时,这个Reload动作还没有完成。换句话说,DoCommand("ReloadScriptFile"),会不会等到Reload完成后才执行下一条指令。

ddid 发表于 2010-4-17 10:54:19

现在看来,你所担心的事,正在发生……

ddid 发表于 2010-4-17 11:04:52

从Details看,ReloadScriptFile至少做了3件事,脚本重编译、脚本引擎重置、lua沙箱重置。

如果你的脚本足够大,重编译肯定需要些时间。
页: [1]
查看完整版本: 耐人寻味的DoCommand("ReloadScriptFile")