北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
123
返回列表 发新帖
楼主: myu

如何让一个coroutine异常终止

[复制链接]
发表于 2010-12-10 10:18:47 | 显示全部楼层
最后,多线程,就是要多个线程同时处理,还需要互相交互。

最常见的,比如copy文件,压缩文件,一般都是多线程的,一个线程负责显示进度,随时等着用户可能的取消等行为,一个线程负责具体操作。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2010-12-10 10:24:06 | 显示全部楼层
hell前辈在此想多问个问题。您的hook模块是不是主要用于战斗解析?作用是临时存储函数?

btw:还有我的消息您是否收到?

[ 本帖最后由 littleknife 于 2010-12-10 10:25 AM 编辑 ]
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
 楼主| 发表于 2010-12-10 10:27:27 | 显示全部楼层
使用wait.lua,不必要有线程思维,wait只需要理解成等待一个事情结束,然后执行下面的代码。什么时候需要等待,分析一下

1做某一件事
2等待这件事结束
3干下一件事

关键是"等待这件事结束",如果用触发,你得保证这个触发不被其它非预期的事件错误地诱发。当然有很多办法可以用来保证,比如说#t-  ,比如说disable插件之类,但在实际使用中,还是会偶尔有被错误地触发的情况,导致机器人出错。而如果使用wait.lua,那么这个触发只会在这个时刻存在,没有被错误触发的风险,这种wait就是实实在在地等待这件事的结束,一旦结束,继续往下执行。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2010-12-10 10:39:21 | 显示全部楼层
原帖由 littleknife 于 2010-12-10 10:24 AM 发表
hell前辈在此想多问个问题。您的hook模块是不是主要用于战斗解析?作用是临时存储函数?

btw:还有我的消息您是否收到?


hook是所有用于处理所有的突发事件

本质就是预先储存我如果遇到突发状况的话怎么办。

比如walk,走之前,就定义了如果忙,如果不通,如果被拦怎么处理。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2010-12-10 10:45:15 | 显示全部楼层
原帖由 myu 于 2010-12-10 10:27 AM 发表
使用wait.lua,不必要有线程思维,wait只需要理解成等待一个事情结束,然后执行下面的代码。什么时候需要等待,分析一下

1做某一件事
2等待这件事结束
3干下一件事

关键是"等待这件事结束",如果用触发,你 ...


这个就是个标准的主流程啊,根本不需要任何插件或者线程相关的东西啊。

以我helllua那种逻辑来说,就是:
做一个定时器。
所有的触发变更角色状态。
定时器到时后,根据状态决定做什么。


比如做一见可能有有busy的事情
就是chat.busystate="waiting"
然后如果现在的状态是waitingbusy,那么就测试下是不是在busy。



当然,这个是个朴素的逻辑。实际上,用ticktime在做复杂任务的时候要浪费两个tick之间的时间。

所以我是直接callhook或者do_xxx(ok)这样的形式直接执行ticktime
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2010-12-10 11:15:31 | 显示全部楼层
以打坐机器人来说,我写个我的基本思路流程,你看看和你用线程的wait.lua哪个更好。

paths={}
path[dazuoloc][sleeploc]="e"
path[foodloc][dazuoloc]="e,w"
path[foodloc][sleeploc]="dd,"
path[drinkloc]][sleeploc]="kk,"
.....................
//既然反全自动机器人,就发path型的机器人。

char={}角色信息
//以下为hp取得的信息,由hp()函数自动取得
char.hp=0
char.hpmax=0
char.neili=0
char.neilimax=0
//一下为i 取得的信息,由item()函数自动取得
char.foodcount=0
char.dirinkcount=0
//以下为行走信息.
char.nowloc=dazuoloc
char.toloc=dazuoloc.
//以下为dazuo的信息
char.dazuobediantime=os.time()//取得打坐开始的时间,用于打坐时间过长的判断。
char.busy="dazuo"。
char.busytimeout=os,time
char.lastsleep=os.time

主函数:
function main=(
        if busy!=null then
                 if os.time                   return end//如果在忙则不处理。忙超时的内容由其他函数处理。
                 else
                          busytimeout(busy时间比预期的长,检查是否还在busy)
            
        elseif nowloc~=toloc then char.busy="walking",walkpath(nowloc,toloc) end
        elseif hp不足 then
                             if os,time-lastsleep>sleepdelay then if nowloc==sleep loc doleep else walkpath(nowloc,sleeploc)//测试是否可以睡觉,以及是否在睡觉的地方。
                             else yun recover,hp()
       elseif food不足 then do_buyfood,参照sleep部分
       elseif drink不足then do_buydrunk 参考food
       elseif nowloc~=dazuoloc walkpath(nowloc,dazuoloc)
       else  开始打坐 char.busytimeout = ostime + 3000,char.busy = "dazuo" ,do_dazuo
       end
       reset 主计时
end
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2010-12-10 11:17:00 | 显示全部楼层
还有吃喝的timeout,这个就不写了
具体的buy,dazuo的实现,也不写了。
主题框架已经有了。

不知道wait.lua和线程对打坐这样的任务有什么帮助……
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2010-12-10 11:23:56 | 显示全部楼层
jarlyyn编程达人。。佩服!

学习ing.......5 5
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
发表于 2010-12-10 12:10:21 | 显示全部楼层
jarlyyn大侠的helllua大概算是mud机器人的一个里程碑了。
呵呵。希望大侠有时间能搞个帮助什么的。
北大侠客行Mud(pkuxkx.com),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-11-28 09:13 PM , Processed in 0.011238 second(s), 12 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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