myu 发表于 2010-12-12 12:41:50

困扰已久的问题,终于明白了

为什么一个mushclient打开两个以上窗口,就会发生线程丢失的事情,一直在找原因,终于弄明白了。
    发生这种情况有两个必要条件
    1、使用了timer定时器
    2、由定时器,直接或者间接引发了DoCommand("ReloadScriptFile")
    当这种情况发生时,这个DoCommand可能并不在本窗口执行,而是在另一个窗口执行了,这就导致另一个窗口脚本重载。

    大家可以做个一个实验,用mushclient打开两个窗口,在窗口1的配置中将AltA定义为/print("我是窗口一"),在窗口2的配置中将AltA定义为/print("我是窗口二"),然后在窗口1中建立一个timer,每隔5秒执行一次DoCommand("AltA")。
    仔细观察,虽然大部分时间会在窗口1打印“我是窗口一",但偶尔这个DoCommand并没有在窗口1执行,而是跑到窗口2执行,从而打印出“我是窗口2"。

   我以前一直以为线程丢失是由于wait引起的,看来完全弄错了,原来真正的bug在这个地方。可是怎么样完美地解决呢?一是不用timer,这显然做不到,二是不用DoCommand,在线程方式下这也非常困难,三个不让timer引发DoCommand,暂时没找到办法,因为间接的引发也不行。
   还有一个办法,是全部使用插件,使用插件方式,主窗口的ReloadScriptFile对插件没有影响。但插件的封闭性存在不足,且不利维护。

<有答案了,在11楼>

[ 本帖最后由 myu 于 2011-1-6 11:30 AM 编辑 ]

myu 发表于 2010-12-12 18:04:16

跳跳熊有什么高见吗?

maper 发表于 2010-12-12 19:22:18

避免ReloadScriptFile 试试看

myu 发表于 2010-12-12 19:38:51

不大好避免,因为总有非预期的事件发生

reallove 发表于 2010-12-13 12:10:00

这有啥好困扰的
开两个mushclient呗

myu 发表于 2010-12-14 09:24:13

回复 undefined 的帖子

ttk_42

jarlyyn 发表于 2010-12-14 09:40:45

记得有指定发送到哪个world的?

myu 发表于 2010-12-14 09:44:39

原帖由 jarlyyn 于 2010-12-14 09:40 AM 发表 http://www.pkuxkx.com/forum/images/common/back.gif
记得有指定发送到哪个world的?

赶紧的,查查看。

jarlyyn 发表于 2010-12-14 09:45:36

这个肯定有的。help里也应该有。
不过现在在linux下,查hlp不方便

myu 发表于 2011-1-6 11:24:17

原帖由 jarlyyn 于 2010-12-14 09:45 AM 发表 http://www.pkuxkx.com/forum/images/common/back.gif
这个肯定有的。help里也应该有。
不过现在在linux下,查hlp不方便

这个真没有
页: [1] 2
查看完整版本: 困扰已久的问题,终于明白了