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