北大侠客行MUD论坛

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

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

[复制链接]
发表于 2014-2-27 10:20:24 | 显示全部楼层 |阅读模式
本帖最后由 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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2014-2-27 12:08:37 | 显示全部楼层
这个用触发不就能解决了吗?

      enabled="y"
   group="url"
   match="^http://pkuxkx.com/antirobot/(.+)$"
   regexp="y"
   send_to="12"
   sequence="100"
  >
  OpenBrowser("http://pkuxkx.com/antirobot/".."%1")
  
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2014-2-27 12:15:22 | 显示全部楼层
回复 2# feehoo

插件是为了方便大家使用嘛,而且还有自动在命令框加上fullme 的触发。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2014-2-27 14:11:47 | 显示全部楼层
想研究一下如何通过在mush中将fullme 插件改成不会阻塞主线程的方法,发现还是挺有技术难度的,期待lua高手来实现吧,@labaz,@littleknife,@...(以下省略一万字)
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2014-2-27 14:22:35 | 显示全部楼层
回复 4# pizzagoo

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

lua 可以使用非阻塞式的socket,但是mushclient自身有一个main loop来处理所有的事件。也就无法在plugin中再通过loop来处理非阻塞式的socket了。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2014-2-27 14:31:06 | 显示全部楼层
回复  pizzagoo

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

lua 可以使用非阻塞式的socket,但是m ...
uniboee 发表于 2014-2-27 02:22 PM



应该是有解的,主要是不太懂脚本语言,所以看代码有点力不从心。
核心思想就是:在通过socket获取一组数据时,判断是否网速过慢,如果太慢则suspend改线程。
可能需要修改socket/http.lua这个文件,提供个链接,lz看一下能不能实现
http://www.lua.org/pil/9.4.html
希望我没有搞错
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 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来处理所有的输入,输出,显示,触发,等等,一旦其中某个操作暂停,其它的都得等着。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 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
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2014-2-27 14:56:33 | 显示全部楼层
回复 8# pizzagoo

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

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

这说明 mushclient 在执行脚本解释时,是单线程的,脚本中的任何耗时操作,都会让整个客户端停下来。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2014-2-27 15:00:40 | 显示全部楼层
回复 9# uniboee

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

改善为:
____----___----___-----____-----____-----____----___----___
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 11:19 AM , Processed in 0.012000 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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