`
fiona1011
  • 浏览: 58481 次
  • 性别: Icon_minigender_2
  • 来自: 天津
文章分类
社区版块
存档分类
最新评论

利用CActiveSchedulerWait将异步操作转换为同步

阅读更多
总的来说,CActiveSchedulerWait应该用在某个活动对象中,目的是把某个异步操作转换为同步操作。以获取IMEI为例:
class CImeiEngine : public CActive
CImeiEngine是一个活动对象,获取IMEI的核心操作是一个异步操作,看如下代码:
void CImeiEngine::GetImei()
{
if ( IsActive() )
{
Cancel();
}

CTelephony::TPhoneIdV1Pckg phoneIdPckg( iPhoneId );
iTelephony->GetPhoneId( iStatus, phoneIdPckg );

SetActive();
StartWait();
}
我们就是通过CTelephony::GetPhoneId来获取IMEI号的,但是我们在实际使用中,最好将CImeiEngine::GetImei方法做成同步的,这样最方便。设想一下调用流程:
iImeiEngine->GetImei(); //iImeiEngine是一个CImeiEngine实例
DoSomeThingWithImei(); //此时IMEI号肯定已经获取成功

为了保证以上的同步调用正常工作,GetImei()必须是一个同步方法,这就是需要使用CActiveSchedulerWait的原因。
看一下CImeiEngine::StartWait的实现:
void CImeiEngine::StartWait( )
{
if ( iWait.IsStarted() != (TInt)ETrue )
{
iWait.Start();
}
}
代码相当简单,就是调用了CActiveSchedulerWait::Start方法而已。
程序运行到CImeiEngine::GetImei中的StartWait()这行代码后,将会一直阻塞(实际上是阻塞在iWait.Start()这一行),直到CImeiEngine::RunL被调用:
void CImeiEngine::RunL()
{
iWait.AsyncStop();

if ( iStatus == KErrNone )
{
// The request is successful
TBuf manufacturer = iPhoneId.iManufacturer;
TBuf model = iPhoneId.iModel;
TBuf serialNumber = iPhoneId.iSerialNumber;

if ( iObserver )
{
CTelephony::TPhoneIdV1Pckg phoneIdPckg( iPhoneId );
iObserver->UpdatePhoneInfo( serialNumber );
}
}
}
在RunL中,首先调用iWait.AsyncStop()这会导致CActiveSchedulerWait结束等待,也就是回到 iWait.Start()之后。但是因为活动对象的特殊性,走完iWait.AsyncStop()这步并不会立刻返回到iWait.Start(),而是在RunL走完才会返回,所以没有必要将iWait.AsyncStop()放到RunL函数的末尾。
这样,CImeiEngine::GetImei就被设计成为一个同步方法了。

将异步转换为同步,还可以使用User::WaitForRequest方法,但是据说有些情况下无法正常工作,这个方法会一直挂起,我倒是没有机会遇到这种情况。

题外话:
为了获取IMEI号,也可以不将GetImei设计为同步方法,这样就避免了使用CActiveSchedulerWait。这样做需要尽可能早地执行 CTelephoy::GetPhoneId,并把获取到的IMEI号保存起来,在使用IMEI号前还需要判断是否已经成功获取。无论如何,这种方案都没有同步获取来得安全。

附注:
以上示例中,iWait是CImeiEngine的一个成员对象:
class CImeiEngine : public CActive
{

private:
CActiveSchedulerWait iWait;

}
iWait作为CImeiEngine的一个成员变量,在CImeiEngine初始化完成之后就已经被构造,所以无须手工构造及释放。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/paulluo0739/archive/2008/11/19/3335523.aspx
分享到:
评论

相关推荐

    一种将异步时钟域转换成同步时钟域的方法.

    将异步时钟域转换为同步时钟域是解决时钟域交叉问题的关键步骤,确保数字系统中的数据准确无误地传输。通过采用合适的转换方法和错误管理策略,设计师可以构建出高效、可靠的跨时钟域系统。 综上所述,理解和掌握...

    异步清零和同步清零置数区别

    异步置数则与异步清零类似,置数操作不依赖于时钟信号,一旦置数条件满足,电路会立即进行置数操作,将数据设置为指定值。这种操作方式响应速度快,但同样可能对电路的稳定性和同步性造成影响。 在实际应用中,异步...

    Angular异步变同步处理方法

    when()方法则用于将一个可能尚未满足Promise标准的对象转换为一个Promise对象。 $q服务中的defer()方法允许开发者通过resolve和reject方法定义异步操作成功或失败的状态,并可以传递参数。这些操作的结果通过...

    C#同步异步操作说明

    在C#编程中,同步和异步操作是两种不同的执行方式,它们主要涉及到程序的执行流程和资源利用效率。同步方法和异步方法的核心区别在于处理任务的方式。 **同步方法**: 同步方法在调用后会阻塞主线程,直到方法执行...

    同步执行和异步执行学习Demo

    例如,Node.js的事件驱动模型就是一个很好的例子,它的单线程模型中,大部分I/O操作都是异步的,以提高服务器性能,但对于计算密集型任务,可能会引入线程池进行同步计算,以充分利用多核处理器资源。 了解和熟练...

    C# 同步与异步读写

    本篇文章将深入探讨C#中的同步与异步读写,并结合“第一次实验(同步与异步读写)”的实践案例进行解析。 首先,我们要理解同步和异步的基本概念。同步操作意味着代码执行是线性的,一个任务必须等待另一个任务完成...

    C#异步操作 异步查询数据库 异步处理一行一行加载数据

    如果一个方法中大部分时间都在等待异步操作完成,那么这个方法可能是同步的,无需标记为`async`。此外,使用`ConfigureAwait(false)`可以帮助减轻上下文切换的开销,但要注意这可能会改变当前的...

    C#TCP/IP同步和异步通信

    本文将深入探讨如何在C#编程环境中实现TCP/IP的同步和异步通信,并结合提供的“WindowsInternetServer”压缩包文件,讲解如何封装这两种通信方式。 首先,TCP/IP同步通信是指在发送数据前,必须等待接收方确认接收...

    一种将异步时钟域转换成同步时钟域的方法

    该文档是华为技术的专利,里面详细介绍了一种FPGA中将异步时钟域转换成同步时钟域的方法。

    异步时钟域同步化处理方法

    本文将深入探讨几种异步时钟域同步化处理的方法,以确保系统稳定性和可靠性。 首先,我们来理解一下什么是异步时钟域。在FPGA设计中,不同的模块或功能块可能由不同的时钟源驱动,这些时钟源的频率可能相同也可能...

    异步数据同步组件

    异步数据同步组件在技术需求方面,不仅涉及到数据的存储、描述、传输和加密等基础技术,还包括了数据与业务操作之间的联动,确保数据流转能够激活业务操作,反之亦然。为了实现这些功能,组件支持多种数据存在方式的...

    android 简单同步与异步

    本文将深入探讨Android中的简单同步与异步处理,并基于给出的资源进行讲解。 首先,我们来理解同步和异步的基本概念。同步是指程序按照顺序执行,一个任务必须等待前一个任务完成才能继续。而在异步模式下,多个...

    异步复位同步释放

    该方法的基本思路是先将异步复位信号转换为同步信号,然后再利用这个同步信号来控制复位过程。这样做的好处是既能减少资源消耗,又能避免亚稳态问题。 **示例代码**: ```verilog always @(posedge clk) rst_nr ; //...

    同步复位和异步复位比较

    这种方法通过添加“复位同步器”(Reset Synchronizer)模块,将异步复位信号转换为与特定时钟同步的信号,确保复位信号释放时的稳定性和可预测性。 Verilog代码示例: ```verilog module Reset_Synchronizer ...

    verilog中同步复位,异步复位,同步释放优缺点以及PLL配置复位设计.docx

    同步复位的优点是可以避免异步复位的缺陷,但是同步复位需要更多的器件资源,无法充分利用寄存器专用的复位端口 CLRN。 同步释放 同步释放是指在系统复位后,使用同一个时钟域的寄存器输出确定状态,然后再与目标...

    异步起动永磁同步电动机起动性能仿真设计.pdf

    本文提出的基于ANSYS的异步起动永磁同步电动机起动性能仿真设计方法可以为异步起动永磁同步电动机的设计和优化提供有价值的参考。 知识点: 1. 异步起动永磁同步电动机(LSPMSM)的基本结构和工作原理 2. 异步起动...

    MySQL关于异步复制、同步复制半同步复制、无损复制的概念与区别

    其中涉及到异步复制、同步复制、半同步复制以及无损复制等不同的复制类型,每种复制方式各有特点和适用场景。 首先,异步复制(Asynchronous Replication)是MySQL的默认复制方式。在这种模式下,主服务器(Master...

    微信小程序异步API同步化研究.pdf

    同步化是一种将异步操作转变成同步操作的技术手段,让开发者可以在一个同步的流程中处理原本异步的操作。通过同步化处理,开发者可以像处理同步代码一样等待异步操作的结果,然后再执行后续的代码。这样一来,就可以...

    对立统一——异步时钟同步化

    - **PLL协作时异步复位信号同步化**:在使用PLL的情况下,可以先利用输入晶振对异步复位信号进行初步同步,然后再结合PLL的锁定信号进行最终的同步处理。 #### 四、异步复位信号同步化实例 **1. 基本同步化设计** ...

Global site tag (gtag.js) - Google Analytics