Symbian OA异步调用的理解

Symbian操作系统在设计时考虑到了性能和效率,其中异步调用机制是其核心特性之一。异步调用允许程序在等待某个长时间运行的操作(如网络通信或文件读写)完成的同时,继续执行其他任务,避免了程序的阻塞。在Symbian的Object Activation(OA)框架中,异步调用被广泛使用,它通过活动对象(Active Object)的概念来实现。 1.异步函数与活动对象:异步函数通常会接收一个`TRequestStatus`参数,用于跟踪请求的状态。当调用这样的函数后,程序并不会立即停止等待操作完成,而是继续执行后续的代码。例如,`iTimer.After(iStatus,1000*1000)`设置了一个计时器,将在1秒后完成。在这一秒内,程序可以执行其他任务,如`doSomething()`,而不必等待计时器的完成。 2. `SetActive()`的角色:在调用异步函数后,活动对象的`IsActive()`返回`EFalse`。只有当调用`SetActive()`后,`IsActive()`才会变为`ETrue`,这向活动调度器表明存在一个异步请求。但是,`SetActive()`并不会立即触发`RunL()`的执行,它只是将活动对象标记为活动状态,等待调度器适时调用。 3.异步操作的执行与状态:如果异步操作需要较长时间,活动对象将保持`KRequestPending`状态。一旦操作完成,`iStatus`将不再为`KRequestPending`,这表明异步操作已结束。 4. `RunL()`的调用时机: `RunL()`函数的执行由活动调度器根据活动对象的状态决定。只有当`iStatus`不再表示异步操作正在进行(即不是`KRequestPending`)且`IsActive()`为`ETrue`时,`RunL()`会被调用。在这个函数中,你可以检查`iStatus`来判断异步操作是否成功,如`If(iStatus==KErrNone)`。 5. `User::WaitForRequest()`的使用: `User::WaitForRequest()`函数用于阻塞当前线程,直到异步请求完成。这意味着在异步操作完成之前,后续代码不会被执行。当`User::WaitForRequest()`返回后,活动对象的`IsActive()`将变为`EFalse`,再次调用`SetActive()`无效,因为`RunL()`不会被调用。 Symbian的异步调用机制通过活动对象、`SetActive()`、`RunL()`和`User::WaitForRequest()`等组件协同工作,提供了一种高效处理长时间操作的方法,同时确保了程序的响应性和非阻塞性质。理解和掌握这些概念对于编写高效的Symbian应用程序至关重要。
doc 文件大小:15KB