|
发表于 2012-7-21 14:42:17
|
显示全部楼层
tiancaigao7 发表于 2012-7-21 14:08
大侠,详解这个帖子问一个疑问。首先,如果我定义了一个事件,并且编写了一个事件处理函数。那么在这个事 ...
这个问题问的好。
djyos的事件类型,分两类,一类叫关联型(以枚举常量enum_correlative表示),表示先后发生的该类型事件是有关联的,例如串口接收,必须按顺序收数据,才能正确解包。
另一类是独立型(以枚举常量enum_independence表示),表示先后发生的该类型事件没有关联,例如web服务,每个服务可以独立响应。
还有种应用,比如闪灯事件,该类型的事件,从开机到关机,是不会返回的,也应该被设置成关联型事件。
对于关联型事件,处理函数的写法,一般是:
while(1)
{
do something;
djy_wait_evtt_pop(djy_my_evtt_id(),1),cn_timeout_forever;
}
串口接收中断第一次弹出事件后,线程就会得到执行,处理完数据后,在djy_wait_evtt_pop函数处阻塞;中断中再次弹出事件时,线程会得到一个“通知”,线程继续执行。
就算执行函数返回了,如果你这个线程优先级高于128,或者在不支持动态内存的计算机上执行,线程不会被删除,下次中断弹出事件后,会立即投入运行。
对于独立型事件,则每次弹出都会新创建事件,由新线程处理。这时候,djyos的另一个突出特点:天然的线程池功能就显示出威力了。
事件类型的参量:
vpus_res; //系统为本类型事件保留的数量
vpus_limit; //本类型事件允许同时拥有的线程个数
vpus; //本类型事件已经拥有的线程个数
比如在web服务器中,web服务很繁忙时,系统会给它分配较多线程,使每次请求都能立即得到线程。web服务不繁忙时,仅保留最低数量的线程,甚至只有1个或0个,取决于vpus_res;的取值。 |
|