Symbian 编程之活动对象正解
2010-03-18 20:58:00 来源:WEB开发网一、使用CActiveSchedulerWait类
在以前的文章"Symbian编程总结-界面篇-打开jpeg/gif/png图像"里我们已经看到了CActiveSchedulerWait类的使用方法,在此我再详细介绍一下。
很多初学者在开始时会将CActiveScheduler和CActiveSchedulerWait类弄混,CActiveScheduler是活动对象的调度器,而CActiveSchedulerWait可以简单的理解为一个当前线程的阻塞器:
调用 CActiveSchedulerWait::Start()方法时,线程阻塞;
调用 CActiveSchedulerWait::AsyncStop()方法时,请求停止对线程的阻塞
因此,我们在不修改原来活动对象代码的情况下,只要简单的在异步函数调用方法后加上"CActiveSchedulerWait::Start()",在活动对象的RunL方法的开头加入"CActiveSchedulerWait::AnsycStop()"就可以了。
针对上一节教程介绍的控制台应用程序,我们对以下几个方法(下划线为修改部分)进行修改:
点击此处下载源代码
CActiveSchedulerWait* iWait;
void CMyActiveObject::ConstructL()
{
User::LeaveIfError(iTimer.CreateLocal() ); // Initialize timer
CActiveScheduler::Add( this); // Add to scheduler
iWait = new (ELeave)CActiveSchedulerWait;
}
CMyActiveObject::~CMyActiveObject()
{
Cancel(); // Cancel any request, if outstanding
iTimer.Close(); // Destroy the RTimer object
// Delete instance variables if any
if (iWait->IsStarted())
{
iWait->AsyncStop();
}
delete iWait;
iWait = NULL;
}
void CMyActiveObject::StartL(TTimeIntervalMicroSeconds32 aDelay)
{
Cancel(); // Cancel any request, just to be sure
iTimer.After(iStatus, aDelay); // Set for later
SetActive(); // Tell scheduler a request is active
iWait->Start(); // 第1点
}
void CMyActiveObject::RunL()
{
iWait->AsyncStop(); // 第2点
TBuf<50> outputStr;
outputStr.AppendNum(iCount);
更多精彩
赞助商链接