×
Namespaces

Variants
Actions

在ETel第三方API(CTelephony)中使用User::WaitForRequest()应注意的问题

From Nokia Developer Wiki
Jump to: navigation, search
Article Metadata

兼容于
平台:
Symbian

文章
huwell 在 28 Jun 2007 创建
最后由 hamishwillee 在 08 May 2013 编辑
  • 设备, 软件 版本:

S60 3rd Edition


  • 详细描述:

ETel第三方API(即CTelephony)是做为异步模式来设计的,从一个活动对象调用它的方法,然后就等待这个方法的完成。做为活动对象所定义的概念来说,一次只能有个一个active request存在。


Telephony的异步工作模式使得它无论何时检测到一个方法被调用时(这时TRequestStatus参数被传入该方法),已经是KRequestPending状态的情况下,都会引发一个异常(Telephony 0)。


一般在Symbian程序员中流传的使异步变同步的方法就是调用User::WaitForRequest来锁定该线程直到方法完成(这个方法是不被提倡的)


这样做主要有两个问题: 1、'异步工作模式可能会花费较长的执行时间才能完成,这样线程就一直处于阻塞模式下,这样可能会引发VIEWSERV 11异常(参考Symbian FAQ-0920) 2、该异步方法的完成可能依靠同一个线城中其他活动对象的工作,而如果阻塞线程的话,那这个异步工作将永远无法完结。 我们在一个具体的CTelephony事例中来考虑问题:

CTelephony::TBatteryInfoV1 batterystrength;
 
CTelephony::TBatteryInfoV1Pckg battery(batterystrength);
 
CTelephony* tel = CTelephony::NewLC();
 
TRequestStatus status = KRequestPending; // (1)
 
tel->GetBatteryInfo(status, battery);
 
User::WaitForRequest(myStat); // (2)
 
...
 
CleanupStack::PopAndDestroy();

这个将意味着:

1、TRequestStatus变量被初始化为KRequestPending(第(1)行),这是一个常见的错误,会引发CTelephony报Telephony 0错误(如上所述),注意一般来说是没有必要对TRequestStatus进行初始化的。


2、如果第(1)行被删除,那代码也永远无法回到第(2)行,因为在线程被阻塞的情况下CTelephony的异步方法是无法被完成的。


结论就是CTelephony应该一直使用异步工作模式,另外使用User::WaitForRequest时一定要谨慎。

This page was last modified on 8 May 2013, at 03:01.
31 page views in the last 30 days.
×