BREW开发教程(14):关于BREW中多任务协调工作

BREW平台提供的是合作式多任务方式。这意味着Applet应用被设计成尽可能以最短的时间运行,在处理完消息后,退出以使其它活动得以进行。BREW环境正常情况下只能有一个Applet处于运行和可见(控制显示器),然而,多个Applet可以以后台方式运行当BREW暂停一个Applet,它将向Applet发送EVT_APP_SUSPEND消息。如果Applet处理该消息时返回TRUE, 表明该Applet已处理过该消息并且没有被调出内存。如果Applet不想处理EVT_APP_SUSPEND消息,可以返回FALSE,在这种情况下,BREW将停止该Applet,将向Applet发送EVT_APP_STOP消息,Applet将被载出内存。

因此采用一个特定的任务间消息处理机制,可以实现多个内存中任务同时运行。下面以一个简单的例子来说明如何实现BREW多任务协调工作。

现在两个应用程序,只是向屏幕中显示一个计数器。如下图所示:

为了区别起见,一个应用显示App1一个应用显示App2。

下面的两个是Soft Key按键。用于模拟向另一个应用发送消息。

假定App1主任务,App2为一从任务。

计数器的值定义在Applet结构中。程序启动时初始化为1

uint8                             m_nIndex;

这里定义了一个消息

#define EVT_START_APP (EVT_USER + 11)

App1的消息处理过程:

switch (eCode){

case EVT_APP_START:

MM_WRITE_LOG0(“Start\r\n”);

return OnStart(pme,eCode,wParam,dwParam);

break;

case  EVT_APP_STOP:

return TRUE;

case EVT_APP_RESUME:

MM_WRITE_LOG0(“Resume\r\n”);

pApp->m_nIndex++;

IWINAPP_SetWindow((IWinApp*)pApp,1,(void *)&rScreen);

return TRUE;

case EVT_START_APP:

MM_WRITE_LOG0(“Restart\r\n”);

ISHELL_StartApplet(pApp->a.m_pIShell,AEECLSID_APP1);

return TRUE;

case EVT_APP_SUSPEND:

MM_WRITE_LOG0(“Suspend\r\n”);

return TRUE;

case EVT_KEY:

case EVT_COMMAND:

return OnKey(pme,eCode,wParam,dwParam);

break;

App2的消息处理机制:

switch (eCode){

case EVT_APP_START:

MM_WRITE_LOG0(“Start\r\n”);

return OnStart(pme,eCode,wParam,dwParam);

break;

case EVT_START_APP:

MM_WRITE_LOG0(“Start the app\r\n”);

ISHELL_StartApplet(pApp->a.m_pIShell,AEECLSID_APP2);

return TRUE;

break;

case  EVT_APP_STOP:

return TRUE;

case EVT_APP_RESUME:

pApp->m_nIndex++;

MM_WRITE_LOG0(“Resume\r\n”);

IWINAPP_SetWindow((IWinApp*)pApp,1,(void *)&rScreen);

return TRUE;

case EVT_APP_SUSPEND:

MM_WRITE_LOG0(“Suspend\r\n”);

return TRUE;

case EVT_KEY:

case EVT_COMMAND:

return OnKey(pme,eCode,wParam,dwParam);

可以看出两个App1的消息处理非常类似。因些都可以作为主任务,另一个则为从任务。

在App1中按键Tuesday:

case AEE_IDS_TUESDAY:

bRet=ISHELL_PostEvent(pThis->m_pIShell,AEECLSID_APP2,EVT_START_APP,0,AEECLSID_APP1);

向App2发起一个启动/恢复命令。

在App2中按键Tuesday:

case AEE_IDS_TUESDAY:

bRet=ISHELL_PostEvent(pThis->m_pIShell,AEECLSID_APP1,EVT_START_APP,0,AEECLSID_APP2);

向App1发起一个启动/恢复命令

从两个Applet的消息处理函数中可以看出都调用了一个。

ISHELL_StartApplet

该函数将异步启动一个Applet,本例子都是让Applet启动自生。如果一个没在内存中,则BREW创建该Applet的一个实例,并发送EVT_APP_START,如果已在后台运行,则将发送EVT_APP_RESUME。

因此,如果BREW不支持前后台多个任务同时运行的话。每次激活一个Applet,其计数器总会显示1。我们在EVT_APP_RESUME消息中对计数加1。

实现运行显示了每次计算数都会加1。因些可以说明BREW中是可以多个任务同时运行的。需不会是一个任务被启动时,其它的任务必需从系统中载出。

如下图所示:

因此通过这种机制,是可以实现一个Applet在后台运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值