Symbian 之活动对象
2010-04-20 16:03:00 来源:WEB开发网5、 实际上只是一个封装的整数,用于表示异步服务提供器返回的状态或错误码。活动对象发出请求后,服务提供器的第一个任务是将iStatus设为 KrequestPending,当请求的服务完成时,服务提供器将iStatus的值设为KErrNone(如果请求成功完成)或错误码。 iStatus
四、活动对象的实现步骤:
1、 构造
活动对象几乎总是要使用二阶段构造,因为活动对象通常需要连接到它们的异步服务提供器,这个连接过程可能失败。
选择最适合活动对象的优先级,该优先级只会影响活动对象在活动规划器的列表中的顺序,实际开发时,很少使用EPriorityStandard以外的优先级。
CCsvFileLoader::CCsvFileLoader(RFs& aFs , CElementList& aElementList , MCsvFileLoaderObserver& aObserver) : CActive (EPriorityStandard)
{
}
void CCsvFileLoader::ConstructL (const TDesC& aFileName)
{
iFileName = aFileName;
User::LeaveIfError(iFile.open(iFs , iFileName , EFileRead));
User::LeaveIfError(iTimeWaster.CreateLocal());
CActiveScheduler::Add(this);
//活动对象加到活动规划器中,这条语句也可以放在第//一阶段构造函数中
}
通过句柄RTimer和RFile链接到所需的两个异步服务器。
警告:必须将活动对象都添加到活动规划器中,并且只能添加一次。添加失败将产生请求迷失的严重错误。
2、 启动活动对象
void CCsvFileLoader::Start( )
{
TInt delay = (iFileName.Size() % 10) * 100000;
iTimeWaster.After(iStatus , delay);
SetActive();//将iActive设为Etrue
}
异步服务提供器(运行在另一线程或进程中)将通过完成下面两件事来用信号通知线程(活动对象所属的线程)。
(1) 增加线程的信号量(这个信号量,一般情况用不到。只是当活动对象所属的线程被挂起时,通过增加信号量重新唤醒这个线程,而线程的挂起通过函数 WaitForAnyRequest())。
(2) 将给定的TRequestStatus设置为不同于KRequestPending的值(如果一切运行良好,则很有可能是KErrNone)。
更多精彩
赞助商链接