关于活动对象SetActive的问题?

wyjjsn 2009-12-15 09:36:25
比如:

void ATimer::RunL()
{
After(TTimeIntervalMicroSeconds32(1000000));
SetActive();
}

为什么我在RUNL()中在after函数后调用SetActive()会报错?
SetActive()到底什么时候用呢?
...全文
236 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
eva_qu 2009-12-16
  • 打赏
  • 举报
回复
其实当运行出错的时候,50%的错误可以根据系统给出的错误码判断出原因
wyjjsn 2009-12-15
  • 打赏
  • 举报
回复
多谢楼上,原来After()中就调用了SetActive()了,太感谢啦!
eva_qu 2009-12-15
  • 打赏
  • 举报
回复
不知道你的ATimer类是否继承自CTimer,如果你的ATimer类继承自CTimer,并且After()函数使用的就是CTimer::After()的话,在执行SetActive()的时候一定会抱错的。因为CTimer的After()函数会帮你做SetActive这件事情,对一个已经处于Active状态的活动对象进行SetActive操作是不允许的。因此,通常除了在活动对象创建的时候SetActive之前不加判断之外,我们通常会按照下面的方式写代码:
if(!IsActive())
{
SetActive();
}

现在再来回答一下SetActive()的作用,活动对象在创建之后就要通过CActiveScheduler::Add()添加到活动规划器中,之后活动规划器根据两个状态来判断应该调用哪个活动对象的RunL()函数,其中之一就是活动对象的iIsActive状态为是否为True,也就是这个活动对象当前是否处于活动状态,即这个活动对象的SetActive()函数是否已经被调用。因此在通过活动对象对一个异步对象进行监视之前,我们需要调用SetActive()使其处于活动状态。

希望上面的回答对你会有一些帮助。如果想了解更多,可以找一些Symbian的书籍看一下,也可以参考SDK中的新手入门,AO是Symbian的重要特性,所以只要是讲Symbian的书籍都对其有详细描述。
2.
jmulxg 2009-12-15
  • 打赏
  • 举报
回复
RunL中 最好别占用太多时间

After(TTimeIntervalMicroSeconds32(1000000));屏蔽掉应该就可以了

3,119

社区成员

发帖
与我相关
我的任务
社区描述
塞班系统(Symbian系统)是塞班公司为手机而设计的操作系统,它的前身是英国宝意昂公司的 EP ( Electronic Piece of cheese)操作系统。
社区管理员
  • Symbian社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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