Symbian 活动规划器 CActiveScheduler 的灵活应用
2010-03-26 21:23:00 来源:WEB开发网{
Cancel(); // Cancel any request, just to be sure
iState = aState;
iTimer.After(iStatus, aDelay); // Set for later
SetActive(); // Tell scheduler a request is active
}
void CNewClassTest::RunL()
{
if (iState == EUninitialized)
{
// older timer event, 当CActiveScheduler::Start()后,程序先到达这里
iState = 10;
}
else if(iState == EInitialized)
{
//// new timer event
iState = 201;
CActiveScheduler::Stop();
}
}
TInt CNewClassTest::RunError(TInt aError)
{
return aError;
}
// 测试代码
// TInt ThreadEntry(TAny *arg), 用户线程的入口函数,省略了一些必要的初始化
TInt ThreadEntry(TAny *arg)
{
CNewClassTest *obj1 = CNewClassTest::NewL();
CNewClassTest *obj2 = CNewClassTest::NewL();
obj-1>StartL(CNewClassTest::EUninitialized,TTimeIntervalMicroSeconds32(1000000)); //1(s)
User::After(5000000); // sleep 5(s)
obj2->StartL(CNewClassTest::EInitialized,TTimeIntervalMicroSeconds32(20000)); //20(ms)
CActiveScheduler::Start();
delete obj1;
delete obj2;
}
以上代码演示了如何灵活使用CActiveScheduler::Start(),至于具体的实现上,还需要调整一下,CActiveScheduler::Start()的必须还要同时启动一个超时定时器,当在设定的超时时间内没有任何异步时间完成,则在超时AO内停止活动规划器CActiveScheduler::Stop(),这样等待下一个循环到来再启动活动规划器。此时可继续执行被 CActiveScheduler::Start()方法挂起的语句和方法。
总结:
1. 可以解决移植代码中出现的上述情况
2. 异步事件的完成检测有时延
3. 因为是异步事件,对于一定的时延,还是可以接受的
更多精彩
赞助商链接