cappuccino 发表于 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

ltblue 发表于 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个数字后,是不是这个协程就算寿终正寝了呢?

ltblue 发表于 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,然后让他们互相不影响吗?

ltblue 发表于 2015-4-21 18:15:37

封装,我的理解,就是只能通过固定方式改或者读,不能通过其他方式改或者读,避免其他模块对本模块的内容进行操作的做法。
曾经看过半本java的书,但是没看太懂,所以不知道理解的对不对

看了wait.lua的如下代码:
function time (seconds)
local id = "wait_timer_" .. GetUniqueNumber ()
threads = 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,就是挂起是吧。所以你刚才写的程序才能继续运行而不等待,因为协程挂起了
换句话说,本协程挂起了,本协程内的代码不运行了,其他协程的代码不受影响,因此就继续创建了下一个协程。
有点懂了好像......仅仅是好像......

ltblue 发表于 2015-4-21 18:21:02

回复ltblue


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

你说 ...
cappuccino 发表于 2015-4-21 06:01 PM http://pkuxkx.com/forum/images/common/back.gif


你觉得,用make的方法好,还是直接”不封装“的方法好呢?

cappuccino 发表于 2015-4-21 18:22:06

回复cappuccino


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


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



回复cappuccino


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

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

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

co是随手取的变量名

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


这个不绝对,要具体问题具体分析

ltblue 发表于 2015-4-21 18:37:50

我找到帖子了
http://pkuxkx.com/forum/viewthread.php?tid=27707&extra=&highlight=wait&page=2

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

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

还是举例渡江的例子

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

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

如果用wait,可否这样

一个协程里写渡江类函数,当渡江需要等待的时候,新建一个协程,协程里调用打坐函数
然后渡江这个协程挂起,打坐协程运行,等打坐一次结束后,打坐协程消失,渡江协程自动恢复,然后再次尝试渡江

ltblue 发表于 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

代码自己都写得不自信,大概是这么个意思行吗?

jarlyyn 发表于 2015-4-21 18:52:56

我找到帖子了


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

如果co可以改, ...
ltblue 发表于 2015-4-21 06:37 PM http://pkuxkx.com/forum/images/common/back.gif

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

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

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

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

比如,船走了,怎么办?

ltblue 发表于 2015-4-21 18:57:01

想了一下,貌似不对
如果只是渡江-不成功-打坐-打坐完毕-回来继续渡江
那根本不需要两个协程啊......

这里想不懂一个问题

协程a里,如果resume里协程b,那么协程a是自动挂起吗?又或者必须手动挂起协程a,协程b才会真正resume?
页: 1 2 3 4 5 6 7 [8] 9 10 11 12
查看完整版本: 我好像误入歧途了