jarlyyn 发表于 2010-12-10 10:18:47

最后,多线程,就是要多个线程同时处理,还需要互相交互。

最常见的,比如copy文件,压缩文件,一般都是多线程的,一个线程负责显示进度,随时等着用户可能的取消等行为,一个线程负责具体操作。

littleknife 发表于 2010-12-10 10:24:06

hell前辈在此想多问个问题。您的hook模块是不是主要用于战斗解析?作用是临时存储函数?

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

[ 本帖最后由 littleknife 于 2010-12-10 10:25 AM 编辑 ]

myu 发表于 2010-12-10 10:27:27

使用wait.lua,不必要有线程思维,wait只需要理解成等待一个事情结束,然后执行下面的代码。什么时候需要等待,分析一下

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

关键是"等待这件事结束",如果用触发,你得保证这个触发不被其它非预期的事件错误地诱发。当然有很多办法可以用来保证,比如说#t-,比如说disable插件之类,但在实际使用中,还是会偶尔有被错误地触发的情况,导致机器人出错。而如果使用wait.lua,那么这个触发只会在这个时刻存在,没有被错误触发的风险,这种wait就是实实在在地等待这件事的结束,一旦结束,继续往下执行。

jarlyyn 发表于 2010-12-10 10:39:21

原帖由 littleknife 于 2010-12-10 10:24 AM 发表 http://www.pkuxkx.com/forum/images/common/back.gif
hell前辈在此想多问个问题。您的hook模块是不是主要用于战斗解析?作用是临时存储函数?

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

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

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

比如walk,走之前,就定义了如果忙,如果不通,如果被拦怎么处理。

jarlyyn 发表于 2010-12-10 10:45:15

原帖由 myu 于 2010-12-10 10:27 AM 发表 http://www.pkuxkx.com/forum/images/common/back.gif
使用wait.lua,不必要有线程思维,wait只需要理解成等待一个事情结束,然后执行下面的代码。什么时候需要等待,分析一下

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

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

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

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


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



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

所以我是直接callhook或者do_xxx(ok)这样的形式直接执行ticktime

jarlyyn 发表于 2010-12-10 11:15:31

以打坐机器人来说,我写个我的基本思路流程,你看看和你用线程的wait.lua哪个更好。

paths={}
path="e"
path="e,w"
path="dd,"
path]="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<char.busytimeout
                  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

jarlyyn 发表于 2010-12-10 11:17:00

还有吃喝的timeout,这个就不写了
具体的buy,dazuo的实现,也不写了。
主题框架已经有了。

不知道wait.lua和线程对打坐这样的任务有什么帮助……

littleknife 发表于 2010-12-10 11:23:56

jarlyyn编程达人。。佩服!yct19 yct23

学习ing.......yct15 yct15

trace 发表于 2010-12-10 12:10:21

jarlyyn大侠的helllua大概算是mud机器人的一个里程碑了。
呵呵。希望大侠有时间能搞个帮助什么的。
页: 1 2 [3]
查看完整版本: 如何让一个coroutine异常终止