Brew的计时器问题

sleeping_dx 2009-05-10 09:13:31
我设计了一个计时器来实现动画, 可是动画效果越来越慢, 这是为什么呢?
// 计时器回调函数
void CBREW_TimerApp::P_Timer(CBREW_TimerApp* pMe)
{
x += 0.5;
y += 0.5;
ISHELL_PostEvent(pMe->m_pIShell, AEECLSID_BREW_TIMER, EVT_TIMER, 0, 0);
}


boolean CBREW_TimerApp::onEvent(AEEEvent evt, uint16 wParam, uint32 dwParam)
{

switch(evt)
{
case EVT_APP_START:
{
IDISPLAY_ClearScreen(m_pIDisplay); // 清屏
g_pIImage = ISHELL_LoadImage(m_pIShell, "Player.png");
IIMAGE_Draw(g_pIImage, x, y);
IDISPLAY_Update(m_pIDisplay); // 更新
ISHELL_SetTimer(m_pIShell, CurTime, (PFNNOTIFY)P_Timer, this);

return TRUE;
}

case EVT_APP_SUSPEND:
return TRUE;

case EVT_APP_RESUME:
return TRUE;

case EVT_APP_MESSAGE:
return(TRUE);

case EVT_KEY:
{
switch(wParam)
{
case AVK_CLR:
return TRUE;

case AVK_UP:
case AVK_DOWN:
case AVK_LEFT:
case AVK_RIGHT:
case AVK_SELECT:
break;

default:
break;
}
break;
}

case EVT_COMMAND:
{
break;
}

case EVT_APP_STOP:
ISHELL_CancelTimer(m_pIShell, (PFNNOTIFY)P_Timer, this);
IIMAGE_Release(g_pIImage); // 释放
return TRUE;
case EVT_TIMER: // 计时器消息
//画图片
IDISPLAY_ClearScreen(m_pIDisplay);
IIMAGE_Draw(g_pIImage, x, y);
IDISPLAY_Update(m_pIDisplay);
ISHELL_SetTimer(m_pIShell, CurTime, (PFNNOTIFY)P_Timer, this); // 重新开启计时器, 实现循环
return TRUE;

default:
break;
}
return FALSE;
}
...全文
1938 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
发现心流 2009-05-11
  • 打赏
  • 举报
回复
楼主接timer消息的话是会延迟,毕竟要向消息队列放置消息,并再次取出



另外休眠模式时是通过降了电压降了频率吧,所以会慢很多
zsf81 2009-05-11
  • 打赏
  • 举报
回复
SLEEP了
FLYUP_CHEN 2009-05-11
  • 打赏
  • 举报
回复
补充一下ISHELL_PostEvent是异步调用的
FLYUP_CHEN 2009-05-11
  • 打赏
  • 举报
回复
直接用ISHELL_SETTimer试一下,不用发消息
  • 打赏
  • 举报
回复
尝试一下:
1)直接调用IShell_settimer而不是发送事件
2)处理EVT_APP_NO_SLEEP事件,直接返回TRUE
sleeping_dx 2009-05-10
  • 打赏
  • 举报
回复
C++中loop是计时器到达指定时间的时候调用的函数(该函数的声明必须是静态的)


ISHELL_SetTimer (getAppPtr()->m_pIShell, 50, (PFNNOTIFY)loop,(void*)this) ;//调用


static void loop(Welcome *recivemail);//声明


void Welcome::loop(Welcome *recivemail)//实现

{

recivemail->run();//只有将该CLASS的指针传过来才可以使用,否则会提示需要静态成员.编译不通过.

}
sleeping_dx 2009-05-10
  • 打赏
  • 举报
回复
定时器时间自动延长,大家都没遇到过吗
来自BREW SDK文档中的描述,希望对你有用:

管理短时计时器和设备睡眠
如果手持设备在固定的持续时间(如 30 秒)内没有键盘活动,则大多数设备将进入睡眠模式。 睡眠模式有助于节约用电。 当设备处于这种模式时,计时器的使用时间会比实际设置的持续时间更长。 因此,如果运行 BREW 应用程序时,且在固定时间段内没有任何键盘活动,则该设备将进入睡眠模式,应用程序设置的任何计时器都将比它的实际持续时间更长。
如果应用程序不接受此行为,并且需要即使在手持设备处于睡眠模式时也可以设置短时计时器,则必须使用 EVT_APP_NO_SLEEP 事件。 收到此事件时,应用程序必须返回 TRUE,向 BREW(和设备)指示该应用程序不希望设备进入睡眠模式。
注意: OEM 将决定是否接受此请求。
sleeping_dx 2009-05-10
  • 打赏
  • 举报
回复
计时器回调函数 必须是静态的? 我在类里边声明了计时器回调函数, 结果是:
1), 不用static void P_Timer(CBREW_TimerApp* pMe); 就会报错, 说
"错误3error C2440: “类型转换”: 无法从“overloaded-function”转换为“PFNNOTIFY” e:\WorkSpace\BREW_Timer\BREW_Timer\BREW_TimerApp.cpp 28"

2), 用 static 声明后的函数, 这样实现时, 就会报一堆的错误
void CBREW_TimerApp::P_Timer(CBREW_TimerApp* pMe)
{
x += 0.5;
y += 0.5;
IDISPLAY_ClearScreen(m_pIDisplay);
IIMAGE_Draw(g_pIImage, x, y);
IDISPLAY_Update(m_pIDisplay);
ISHELL_SetTimer(m_pIShell, CurTime, (PFNNOTIFY)P_Timer, this); // 重新开启计时器, 实现循环
}就会报: 错误 3 error C2440: “类型转换”: 无法从“”转换为“IShell *” e:\WorkSpace\BREW_Timer\BREW_Timer\BREW_TimerApp.cpp 28
等等的一些错误 这是为什么呢?
hhygcy 2009-05-10
  • 打赏
  • 举报
回复
你这个timer实现的有点诡异
常见的做法是ISHELL_SetTimer(m_pIShell, CurTime, (PFNNOTIFY)P_Timer, this);
然后在P_Timer函数实现里面直接做你的EVT_TIMER里面的事情
就是说P_Timer的实现类似于:
void CBREW_TimerApp::P_Timer(CBREW_TimerApp* pMe)
{
x += 0.5;
y += 0.5;
IDISPLAY_ClearScreen(m_pIDisplay);
IIMAGE_Draw(g_pIImage, x, y);
IDISPLAY_Update(m_pIDisplay);
ISHELL_SetTimer(m_pIShell, CurTime, (PFNNOTIFY)P_Timer, this); // 重新开启计时器, 实现循环
}
这样就不需要你这个异步的EVT_TIMER的消息处理了
你试试看 ,可能会好一点

2,851

社区成员

发帖
与我相关
我的任务
社区描述
本论坛以AI、WoS 、XR、IoT、Auto、生成式AI等核心板块组成,为开发者提供便捷及高效的学习和交流平台。 高通开发者专区主页:https://qualcomm.csdn.net/
人工智能物联网机器学习 技术论坛(原bbs) 北京·东城区
社区管理员
  • csdnsqst0050
  • chipseeker
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧