不会卡住 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 这个用触发不就能解决了吗?
<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> 回复 2# feehoo
插件是为了方便大家使用嘛,而且还有自动在命令框加上fullme 的触发。 想研究一下如何通过在mush中将fullme 插件改成不会阻塞主线程的方法,发现还是挺有技术难度的,期待lua高手来实现吧,@labaz,@littleknife,@...(以下省略一万字) 回复 4# pizzagoo
根据mushclient作者自己的说法,应该是无解。
lua 可以使用非阻塞式的socket,但是mushclient自身有一个main loop来处理所有的事件。也就无法在plugin中再通过loop来处理非阻塞式的socket了。 回复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 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 02:56 PM 编辑
回复 7# uniboee
能不能通过这种方式?
fullme触发:
show_fullme
draw_fullme
check_fullme
end
draw_fullme中调用socket,在check_fullme中判断标记为,若未完成,则通过DoAfterSpecial,在一段时间后,在resume 回复 8# pizzagoo
我原本以为造成整个客户端卡死的原因是因为有网络操作,触发函数无法及时返回,导致整个主循环被卡住。
但是我做了一个实验,不用任何触发,直接让客户端执行一个耗时的网络操作,整个客户端还是一样卡死。
这说明 mushclient 在执行脚本解释时,是单线程的,脚本中的任何耗时操作,都会让整个客户端停下来。 回复 9# uniboee
这个我了解,所以,目前的想法就是,如果网速过慢,则通过先将socket suspend,然后分段调用的方式,用于改善其对主线程的block,相当于
__________----------------------------------------------__________________________
主线程 socket 主线程
改善为:
____----___----___-----____-----____-----____----___----___
页:
[1]
2