北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: ltblue

我好像误入歧途了

[复制链接]
发表于 2015-4-21 18:01:04 | 显示全部楼层
回复 70# ltblue


    mushclient根目录下的 /lua/wait.lua,去看看wait是怎么封装coroutine的吧

你说的

co = coroutine.create(function()
autodraw("%1")
end)
coroutine.resume(co)

是一种不经过封装直接就把coroutine拿来用的做法,所以不会有wait
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 18:05:32 | 显示全部楼层
回复 69# cappuccino


也就是说,协程吃资源,不能无限的弄。
只要程序不是有问题,有100个协程应该问题也不大吧?呵呵
只要不是无限的,应该电脑都够用吧......

什么算寿终正寝呢?
举例子:
for i = 1, 10 do
  wait.make(function ()
    for j=1,10 do
      print(i)
      wait.time(1)
    end
  end)
end
输出100个数字后,是不是这个协程就算寿终正寝了呢?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 18:09:08 | 显示全部楼层
回复 71# cappuccino


哦,是这样的
本来吧,我就是在触发或者别名里直接用wait,提示说不让用,一查帖子,说得在协程里用。
然后某帖子的某人就说,建议所有mush里的wait都这样写

co = coroutine.create(function()
autodraw("%1")
end)
coroutine.resume(co)

然后我就这么写了。在这个
autodraw()里,我再用wait,就让用了......
至于什么封装,真心看不懂啊......
这种代码来讲,如果我autodraw()函数里的所有命令执行完毕,或者遇到return,是不是这个协程就算寿终正寝了呢?

还有,co是怎么个概念?可以改名成比如ca,cb,cc,然后让他们互相不影响吗?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 18:15:37 | 显示全部楼层
封装,我的理解,就是只能通过固定方式改或者读,不能通过其他方式改或者读,避免其他模块对本模块的内容进行操作的做法。
曾经看过半本java的书,但是没看太懂,所以不知道理解的对不对

看了wait.lua的如下代码:
function time (seconds)
  local id = "wait_timer_" .. GetUniqueNumber ()
  threads [id] = assert (coroutine.running (), "Must be in coroutine")

  local hours, minutes, seconds = convert_seconds (seconds)

  check (AddTimer (id, hours, minutes, seconds, "",
                  bit.bor (timer_flag.Enabled,
                           timer_flag.OneShot,
                           timer_flag.Temporary,
                           timer_flag.ActiveWhenClosed,
                           timer_flag.Replace),
                   "wait.timer_resume"))

  return coroutine.yield ()
end -- function time

这个应该是比较简单的了吧?可是还是看不大懂
感觉好像是利用了mush里的timer,是吗?
然后有个协程的yield,就是挂起是吧。所以你刚才写的程序才能继续运行而不等待,因为协程挂起了
换句话说,本协程挂起了,本协程内的代码不运行了,其他协程的代码不受影响,因此就继续创建了下一个协程。
有点懂了好像......仅仅是好像......
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 18:21:02 | 显示全部楼层
回复  ltblue


    mushclient根目录下的 /lua/wait.lua,去看看wait是怎么封装coroutine的吧

你说 ...
cappuccino 发表于 2015-4-21 06:01 PM



你觉得,用make的方法好,还是直接”不封装“的方法好呢?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-4-21 18:22:06 | 显示全部楼层
回复  cappuccino


也就是说,协程吃资源,不能无限的弄。
只要程序不是有问题,有100个协程应该问题 ...
ltblue 发表于 2015-4-21 06:05 PM



算。你这个例子里是创建了10个协程,每个协程打印完10次后就结束生命周期了。我听一位大神说这样是不会崩溃的,不过我没有在实践环境中大量验证过,只是听说。



回复  cappuccino


哦,是这样的
本来吧,我就是在触发或者别名里直接用wait,提示说不让用,一查帖子 ...
ltblue 发表于 2015-4-21 06:09 PM


wait.make的本质就是coroutine.create
wait.regexp和wait.time底层调用的是coroutine.yield(好像是叫这个?大约就是挂起的意思)

你想yield,总得告诉系统要yield哪个coroutine吧?你直接在一个触发器里yield,系统哪知道你想要干什么?所以当然得先创建coroutine了。。

co是随手取的变量名

这种代码来讲,如果我autodraw()函数里的所有命令执行完毕,或者遇到return,是不是这个协程就算寿终正寝了呢?


这个不绝对,要具体问题具体分析
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 18:37:50 | 显示全部楼层
我找到帖子了
http://pkuxkx.net/forum/viewthre ... ghlight=wait&page=2

11楼说的,要用
co = coroutine.create(abc)
coroutine.resume(co)

如果co可以改,那我的程序大可以这样了

还是举例渡江的例子

渡江需要等船,等船时无聊打坐

zmud里是打开了dujiang类触发,一堆触发,来确保打坐时同时监控渡江

如果用wait,可否这样

一个协程里写渡江类函数,当渡江需要等待的时候,新建一个协程,协程里调用打坐函数
然后渡江这个协程挂起,打坐协程运行,等打坐一次结束后,打坐协程消失,渡江协程自动恢复,然后再次尝试渡江
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 18:43:26 | 显示全部楼层
dujiang = coroutine.create(dj)
coroutine.resume(dj)

function dj
渡江XXX
如果不成功
dazuo = coroutine.create(dz)
coroutine.resume(dz)
coroutine.yield ()
wait.time(20)    --如果打坐时间过长,还是得回来继续渡江,不管打坐成什么样
end

function dz
打坐
wait.regexp (打坐结束)
coroutine.resume(dj)
end

代码自己都写得不自信,大概是这么个意思行吗?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-4-21 18:52:56 | 显示全部楼层
我找到帖子了


11楼说的,要用
co = coroutine.create(abc)
coroutine.resume(co)

如果co可以改, ...
ltblue 发表于 2015-4-21 06:37 PM


说真的,你得被这个代码坑的死死的。

你这个没有解决异步时的逻辑问题。

比如,船还没来,打坐完了,怎么办。

比如,船来了,还没打坐完,怎么办。

比如,船走了,怎么办?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-4-21 18:57:01 | 显示全部楼层
想了一下,貌似不对
如果只是渡江-不成功-打坐-打坐完毕-回来继续渡江
那根本不需要两个协程啊......

这里想不懂一个问题

协程a里,如果resume里协程b,那么协程a是自动挂起吗?又或者必须手动挂起协程a,协程b才会真正resume?
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-15 05:49 AM , Processed in 0.010917 second(s), 13 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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