Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 05:19, 28 June 2007.

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

From Forum Nokia Wiki

  • 设备, 软件 版本:

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时一定要谨慎。

Related Discussions
Thread Thread Starter Forum Replies Last Post
problem of CTelephony:: NotifyChange() in 3rd edition SDK ericyklee General Symbian C++ 0 2007-05-15 16:50
RunL never be called when User::WaitForRequest is pending?? KK_Dog General Symbian C++ 5 2006-03-10 07:37
关于异步发送彩信的问题 necy305 Symbian 4 2007-08-01 02:27
Using TRequestStatus directly kasuga General Symbian C++ 4 2006-12-11 17:19
CTelephony::GetPhoneId problem in S60 3rd ed. mike.b General Symbian C++ 5 2006-10-23 13:32
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtopicQUqfnTopicZseriesE5f60Q
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX