uniboee 发表于 2014-2-27 10:20:24

不会卡住 mushclient 客户端的 fullme 插件

本帖最后由 uniboee 于 2014-2-27 12:24 PM 编辑

现有的几个fullme图片显示插件,无论是ddid的原版,还是labaz或者我的修改版,都有一个明显的缺陷:一旦网络访问缓慢,整个mushclient客户端都会被卡死,甚至只能用任务管理器杀掉进程。

为了解决这个问题,我做了一个新的、简单的fullme插件,不再通过mini窗口显示图片,而是自动打开操作系统默认的浏览器显示图片,省去手工打开浏览器,然后复制粘贴的麻烦。

使用方法:
注意,此插件和原来的fullme插件不能共存,使用前请先卸载原有的fullme插件。
1)下载并保存附件中的 pkuxkx_simple_fullme.xml 文件到 mushclient\worlds\plugin\ 目录中
2)打开你的世界(world),按 Ctrl + Shift + P 调出插件管理页面
3)点击 添加(add)按钮,选择步骤1)中的 pkuxkx_simple_fullme.xml ,安装即可。




北大侠客行MUD,中国最好的MUD

feehoo 发表于 2014-2-27 12:08:37

这个用触发不就能解决了吗?
<triggers>
<trigger
   enabled="y"
   group="url"
   match="^http://pkuxkx.net/antirobot/(.+)$"
   regexp="y"
   send_to="12"
   sequence="100"
>
<send>OpenBrowser("http://pkuxkx.net/antirobot/".."%1")</send>
</trigger>
</triggers>

uniboee 发表于 2014-2-27 12:15:22

回复 2# feehoo

插件是为了方便大家使用嘛,而且还有自动在命令框加上fullme 的触发。

pizzagoo 发表于 2014-2-27 14:11:47

想研究一下如何通过在mush中将fullme 插件改成不会阻塞主线程的方法,发现还是挺有技术难度的,期待lua高手来实现吧,@labaz,@littleknife,@...(以下省略一万字)

uniboee 发表于 2014-2-27 14:22:35

回复 4# pizzagoo

根据mushclient作者自己的说法,应该是无解。

lua 可以使用非阻塞式的socket,但是mushclient自身有一个main loop来处理所有的事件。也就无法在plugin中再通过loop来处理非阻塞式的socket了。

pizzagoo 发表于 2014-2-27 14:31:06

回复pizzagoo

根据mushclient作者自己的说法,应该是无解。

lua 可以使用非阻塞式的socket,但是m ...
uniboee 发表于 2014-2-27 02:22 PM http://pkuxkx.net/forum/images/common/back.gif


应该是有解的,主要是不太懂脚本语言,所以看代码有点力不从心。
核心思想就是:在通过socket获取一组数据时,判断是否网速过慢,如果太慢则suspend改线程。
可能需要修改socket/http.lua这个文件,提供个链接,lz看一下能不能实现
http://www.lua.org/pil/9.4.html
希望我没有搞错

uniboee 发表于 2014-2-27 14:40:35

本帖最后由 uniboee 于 2014-2-27 02:42 PM 编辑

回复 6# pizzagoo

lua没有线程啊,lua只有协程,协程之间的调度并不是操作系统负责,而是程序自己来调度。比如有两个协程A和B,如果想让A和B并行运行,就需要A告诉B:你跑吧,我停了;然后B再告诉A:你跑吧,我停了。这种自我协调的并行运行方式和操作系统的线程完全是两个概念。

所以问题就来了:你把socket读写放在一个协程里,没问题;如果网络卡了,你想把这个协程suspend,也没问题;但是你的协程suspend了,怎么去通知mushclient的main loop继续运行呢?

mushclient自身通过一个main loop来处理所有的输入,输出,显示,触发,等等,一旦其中某个操作暂停,其它的都得等着。

pizzagoo 发表于 2014-2-27 14:45:27

本帖最后由 pizzagoo 于 2014-2-27 02:56 PM 编辑

回复 7# uniboee


能不能通过这种方式?
fullme触发:
show_fullme
    draw_fullme
    check_fullme
end
draw_fullme中调用socket,在check_fullme中判断标记为,若未完成,则通过DoAfterSpecial,在一段时间后,在resume

uniboee 发表于 2014-2-27 14:56:33

回复 8# pizzagoo

我原本以为造成整个客户端卡死的原因是因为有网络操作,触发函数无法及时返回,导致整个主循环被卡住。

但是我做了一个实验,不用任何触发,直接让客户端执行一个耗时的网络操作,整个客户端还是一样卡死。

这说明 mushclient 在执行脚本解释时,是单线程的,脚本中的任何耗时操作,都会让整个客户端停下来。

pizzagoo 发表于 2014-2-27 15:00:40

回复 9# uniboee

这个我了解,所以,目前的想法就是,如果网速过慢,则通过先将socket suspend,然后分段调用的方式,用于改善其对主线程的block,相当于
__________----------------------------------------------__________________________
主线程                         socket                                           主线程

改善为:
____----___----___-----____-----____-----____----___----___
页: [1] 2
查看完整版本: 不会卡住 mushclient 客户端的 fullme 插件