">本文示例源代码或素材下载
在上一节里我们深入了解了活动对象、活动调度器及异步函数服务器的工作原理及运行机制,想必大家对活动对象的机制及体系结构的运用已经了如指掌。但是大家有没有觉得异步函数使用起来比较麻烦呢?难道非要使用活动对象,非得以"异步"的方式调用异步函数吗?这一节将为大家解决这个问题:异步函数的同步使用。
一、使用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);
iconsole.write(outputstr);
iconsole.write(_l("n"));
icount++;
}
![]()
如果喜欢symbian编程总结-基础篇-活动对象正解(4)-异步函数的同步调用请收藏或告诉您的好朋友.
阅读(154) | 评论(0) | 转发(0) |