异步变同步

基于STM32的工业I/O模块硬件电路实现 深入解析基于STM32的工业I/O模块硬件电路实现,涵盖关键电路设计与信号处理,突出硬件电路稳定性和工业级可靠性,适合嵌入式开发者参考。 阅读详情

Symbian编程总结-基础篇-活动对象正解(4)-异步函数的同步调用 zz

在上一节里 我们深入了解了活动对象、活动调度器及异步函数服务器的工作原理及运行机制,想必大家对活动对象的机制及体系结构的运用已经了如指掌。但是大家有没有觉得异步函数使用起来比较麻烦呢?难道非要使用活动对象,非得以"异步"的方式调用异步函数吗?这一节将为大家解决这个问题:异步函数的同步使用。

一、使用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++;

    }


    使用CActiveSchedulerWait的几点注意事项:

   1. CActiveSchedulerWait必须结合活动对象使用,而且使用方法只有以上代码介绍的那一种;
    2. Start方法和AsyncStop方法必须成对出现;
    3. 程序退出时要检查CActiveSchedulerWait是否在IsStarted()状态,如果是则调用                AsyncStop方法。否则程序不能正常退出;
    4. CActiveScheduler类内部有自己的静态指针,提供的静态方法都调用了内部的静态指针。而CActiveSchedulerWait 类没有内部静态指针,方法也不是静态的,我们必须自己管理CActiveSchedulerWait类的全局指针,在这点上程序要经过良好的设计。

二、使用User::WaitForRequest方法

如果不想使用活动对象,也不想使用难于管理的CactiveSchedulerWait,你可以使用User::WaitForRequest方法。以下是User::WaitForRequest方法的原型:

IMPORT_C static void WaitForRequest(TRequestStatus& aStatus);


此方法将等待异步函数服务器返回的信号量,然后匹配aStatus参数。如果接收到的信号与参数aStatus一一匹配,则跳过阻塞进入下一行代码,否则继续阻塞线程直到aStatus对应的信号通知返回。

User::WaitForRequest还有一个重载的方法,它可以监视两个信号的通知:

IMPORT_C static void WaitForRequest(TRequestStatus& aStatus1,TRequestStatus& aStatus2);

有了User::WaitForRequest,异步函数使用起来就变得非常方便,我们不需要创建活动对象,也不需要创建成员变量 TRequestStatus,只需要声明局部的TRequestStatus、局部的异步函数类,在异步函数调用之后,加入 User::WaitForRequest(status),就能够使线程阻塞在User::WaitForRequest处直到status对应的异步 函数处理完成。

LOCAL_C void DoTestL()

    {

    RTimer timer;

    CleanupClosePushL(timer);

    User::LeaveIfError(timer.CreateLocal());

    TRequestStatus status(KRequestPending);

    // 调用异步方法并将status传入

    timer.After(status, 1000000);

    // 等待status对应的信号量,此处用了User::WaitForRequest方法将异步方法的调用模拟成同步

   User::WaitForRequest(status);

    CleanupStack::Pop(&timer);

    }
LOCAL_C void MainL()

    {

    TInt n = 0;

    TBuf<10> str;

    _LIT(KNewLine, "/n");

    FOREVER

        {

        DoTestL();

        str.Num(n);

        n++;

        console->Write(str);

        console->Write(KNewLine);

        }

    }


三、使用User::WaitForRequest方法的问题

User::WaitForRequest有时候不会正常运行,如:CImageDecoder::Convert方法:

IMPORT_C virtual void Convert(TRequestStatus* aRequestStatus, CFbsBitmap& aDestination, CFbsBitmap& aDestinationMask, TInt aFrameNumber = 0);


最后一个参数必须为EOptionAlwaysThread,User::WaitForRequest才能正常执行,个人认为 CImageDecoder::Convert如果没有加EOptionAlwaysThread参数的时候是使用"长线任务"(将在下一节介绍)实现的。所以,CImageDecoder::Convert方法应该按照如下方法调用:

    TRequestStatus status(KRequestPending);

    CImageDecoder* decoder = CImageDecoder::FileNewL(iFs, aFileName, KMIMEType);

    decoder->Convert(&status, aBitmap, CImageDecoder::EOptionAlwaysThread);

    User::WaitForRequest(status);

    delete decoder;

    decoder = NULL;


四、小结

本文介绍了在如果将异步函数同步使用。其实在Symbian的早期编程中还有一种异步函数的同步方法,那就是在异步函数调用后使用 CActiveScheduler::Start()方法嵌套活动调度器。但是这种方法已经被Symbian 7.0后的CActiveSchedulerWait替代,在此处就不再介绍。在下一节里将介绍活动对象的长线任务(Long-Running Task)。

另:在介绍活动对象的专题里涉及到很多Symbian OS的客户/服务器架构的知识,我会在近期另外开一个专题讲解,请大家耐心等待。

Comments:除非是有特殊的需求,否则该是异步的还是用异步好。因为,如果同步会阻塞线程,而已如果这个异步的事件处理时间比较长的话会导致用户相应的延迟。异步麻烦?这都麻烦的话,调试多线程算什么呢?


 

来自: http://hi.baidu.com/marktian/blog/item/9a46fddd82e224de8c10297b.html
PCL 法向量夹角剔除错误匹配点对【2026最新版】 实现了一种简单的基于对应点法线角度的对应关系去除方法。博客长期更新,本文最新更新时间为:2026年5月24日。 阅读详情

相关推荐

慕课软件质量保证与测试(习题集)

慕课金陵科技学院.软件质量保证与测试.期末复习.习题汇总0 总目录1 绪论1.1 软件质量保证与测试的产生与发展1.2 软件缺陷,软件错误,软件故障1.3 软件质量保证与测试的意义,原则和挑战1.4 单元测试1.5 课后作业2 软件测试策略2.1 软件测试的模型,过程和生命周期2.2 软件测试的方法和技术2.3 单元测试2.4 课后作业3 黑盒测试3.1 黑盒测试概述3.2 等价类划分测试3.3 边界值测试3.4 错误推测法3.5 判定表驱动法3.6 因果图法3.7 场景法3.8 正交实验法3.9 单元测试

weixin_42473228的博客 5万+

实现异步转同步的几种方式

在循环等待中,我们可以使用一个变量来指示异步操作是否已完成。然后,我们可以在循环中检查该变量,如果它指示异步操作已完成,则退出循环。否则,我们可以让线程等待一段时间,然后再次检查该变量。这样,我们就可以在等待异步操作完成的同时,不会使线程长时间处于停滞状态。例如,假设我们要执行一个异步操作,该操作将异步地返回一个结果。我们可以使用以下代码来实现循环等待: 我们在上面的例子中使用了一个简单的循环等待来实现异步转同步,但这种方法并不是最优的。首先,它会阻塞线程,这意味着线程会一直处于停滞状态,直到异步操作完成。

鳄鱼儿 7078

【传感器标定(三):激光雷达标定原理与实现详解】

本文系统介绍了激光雷达标定的基本原理与方法。主要内容包括:激光雷达标定的分类(内参标定和外参标定)、坐标系定义和刚体变换数学基础;详细阐述了测距误差和光束方向两种内参标定方法;重点分析了基于目标(平面标定板、三维标定物)和基于运动(手眼标定、点云配准)的外参标定方法;介绍了多传感器联合标定技术及非线性优化、鲁棒标定等实现方法;最后提出了定量和定性两种标定评估体系。为激光雷达在自动驾驶等领域的精确应用提供了系统的标定技术指导。

weixin_47429781的博客 3788

C#将异步改成同步方法

注意:虽然这样可以将异步方法转为同步,但在实际开发中,我们通常推荐使用异步方法,因为它可以提高应用程序的响应性和并发性。将异步方法转为同步可能会导致死锁或性能问题。在C#中,你可以使用Task的Result属性或者Wait方法将异步方法转化为同步。

高性价比服务器就选:蓝易云 1459

【同花顺公式编辑教程】第3章 获取数据

学习同花顺公式编辑器,其提供的数据有量价数据以及财务数据。在本章中,我们讲解了编辑器执行代码的原理,并给出了可调用数据的汇总表。

LiaoYi2016218的博客 1万+

基于ROS的机械臂手眼标定-Aruco使用与相机标定

基于ROS的机械臂手眼标定-Aruco使用与相机标定 折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。 程序都是Copy的开源代码,所以也开源出来: 开源地址:https://gitee.com/ohhuo/handeye-calib 作为手眼标定中的重要一环,相机中标定板位姿关系获取直接影响标定精度,我们使用aruco这个开源程序来实现坐标的获取。 #mermaid-svg-WkFpFkV4QqzXMvJ4 .labe

生活不止眼前的苟且 1万+

异步执行转化为同步执行的方法

异步转化为同步的基本思路

qq_51130780的博客 3142

Android 15网络子系统深度解析(一):ConnectivityService与网络管理框架全解析

深入剖析Android 15核心网络服务ConnectivityService的架构设计、NetworkAgent/Factory机制、网络状态管理、以及WiFi/移动网络切换的完整流程

Cheson的专栏 1749

Java中实现异步转同步的几种方式

实现异步转同步

qq_44691484的博客 3282

模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

整理的算法模板合集: ACM模板 目录一、树的直径树形DP两次DFS / BFS(找到直径的两个端点)二、动态修改树的边权并求每个时刻的直径(线段树)三、树的重心 一、树的直径 树的直径满足如下性质: 若有多条直径,则所有的直径之间皆有公共点。 直径的两端一定是叶子。 树中距离某一直径端点最远的点,至少有一个是该直径的另一个端点。 对于树上任意一个点,与之距离最远的一个点,至少有一个直径的端点。 给你一个无权无向的树。编写程序以输出该树中最长路径(从一个节点到另一个节点)的长度。在这

繁凡さん的博客 1676

ROS Noetic下Gazebo仿真:从零搭建两轮差速机器人(含ros_control配置避坑指南)

本文详细介绍了在ROS Noetic环境下,使用Gazebo从零搭建两轮差速机器人并进行仿真的完整流程。核心内容包括利用Xacro进行模块化建模,并重点解析了通过ros_control框架配置机器人运动控制的详细步骤与常见避坑指南,帮助开发者成功实现机器人在仿真环境中的差速驱动与运动控制。

game4的博客 620

js异步成同步

这里写目录标题题目解答Callback(回调函数)PromiseGeneratorasync js异步成同步有4种方法:Callback/Promise/Generator/async,下面我以题目为例子演示这四种方法。 题目 现有打印红色、绿色和黄色三个函数,要求等待三秒后打印一次红色,然后等待2秒后打印一次绿色,接着等待一秒后再打印一次黄色;按此规律不断循环打印红绿黄。 // 亮灯函数如下: function red(){ console.log(‘red’); } function gree

kjprime的博客 1万+

MATLAB基础应用精讲-【数模应用】游程检验(附MATLAB、R语言和python代码实现)

游程检验是一种非参数性统计假设的检验方法,它是游程总数检验和最大游程检验的总称,用于两个独立样本的比较和观测结果随机性的检验测试。​游程检验亦称“连贯检验”,是根据样本标志表现排列所形成的游程的多少进行判断的检验方法。[2]例1:设某样本n=12人的标志表现为男、女,有以下三种排列。(i) 男\男,女\女\女,男,女\女,男\男\男\男;(ii) 男\男\男\男\男\男\男,女\女\女\女\女;(iii) 男,女,男,女,男,女,男,女,男,女,男\男;连续出现男或女的区段称为游程。

qq_36130719的博客 607

Javascript 中通过 yield 和 promise 使异步变同步

背景 由于最近一段时间一直在用react-native进行APP的开发,所以接触了不少 javascript。 在我们第一次使用react-native + redux + saga开发的过程中,学习、见识到了不少javascript神奇的功能,比如在使用saga的过程中用到了 yield,并且对于其使得异步操作同步化十分好奇,就进行了一番探索。 yield简单介绍 先看一段简单的代码 funct...

极客神殿 2889

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Angular异步变同步处理

1. 背景在前端项目中,经常会遇到页面有多个接口,后一个接口参数需要从前一个接口的返回数据中获取,这就存在接口必须按顺序一个一个执行。而Angular提供的Http服务请求接口都是异步请求,因此通常情况下会写成如下的代码:funA(arg1,arg2,function(){ funcB(arg1,arg2,function(){ funcC(arg1,arg2,functi...

紫箫风铃的博客 3万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

angularjs 同步請求_Angular异步变同步处理方法

1. 背景在前端项目中,经常会遇到页面有多个接口,后一个接口参数需要从前一个接口的返回数据中获取,这就存在接口必须按顺序一个一个执行。而Angular提供的Http服务请求接口都是异步请求,因此通常情况下会写成如下的代码:funA(arg1,arg2,function(){funcB(arg1,arg2,function(){funcC(arg1,arg2,function(){xxxx....}...

weixin_39588252的博客 1472

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

异步变同步:JavaScript的async/await与Promise

🤍 前端开发工程师、技术日更博主、已过CET6🍨、23年度博客之星前端领域TOP1🕠高级专题作者、打造专栏🍚签约作者、上架课程。

你若盛开,清风自来 1475

js异步变同步、同步变异步

js异步变同步、同步变异步。

wcdunf的博客 2884

promise(让异步变的同步)

promise是什么? 1、主要用于异步计算 2、可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果 3、可以在对象之间传递和操作promise,帮助我们处理队列 为什么会有promise? 在实际的使用中,有非常多的应用场景我们不能立即知道应该如何继续往下执行。最常见的一个场景就是ajax请求。通俗来说,由于网速的不同,可能你得到返回值的时间也是不同的,这个时候我们就需要等待,结果出来了之后才知道怎么样继续下去。 // 简单的ajax原生实现 var url = 'data.php'; var

qq_48445738的博客 5777

nodejs异步变同步的几种方式

async库,es6的promise-then,es7的await-async 1. nodejs的async库,有好多种方法支持异步变同步的,常用的有: async.each():for循环中牵涉到异步变同步,经常使用。 async.waterfull(): 同步执行,function之间有数据交互,上一个function的输出,可作为下一个function的输入。 async.ser...

稻草人的格子衫 1万+

Promise 异步变同步

function DIVline(array,fn)    {        var pts;    var index = 1 ;    var arr2 = [];    var driving = new BMap.WalkingRoute(map);    var promise = new Promise(function(resolve,reject){    reso...

hujiujun的博客 7998

async 异步变同步

ES6 async函数 目录ES6 async函数基本用法async的特点使用注意点错误处理三种方法写异步 基本用法 ES2017 标准引入了 async 函数,使得异步操作变得更加方便 async函数是什么?一句话,它就是Generator函数的语法糖 async 函数写法 // 函数声明 async function foo() {}; // 函数表达式 const foo = async ...

通俗易懂 1990

node.js 异步变同步_Node.js同步和异步功能

node.js 异步变同步 在node.js平台中,由于遵循非阻塞编程模型,因此node.js模块中的大多数功能实际上都是异步的。 这意味着,功能内的代码块在很大程度上不会对最终用户造成阻塞,并且不会阻止用户对各种子过程执行不同的操作。 仍然有node.js模块中存在的函数的同步计数器部分。 这是Node.js文件系统模块的同步和异步功能的典型示例。 读取文件的异步功能– var f...

danpu0978的博客 351

异步函数变同步

js的异步函数变同步的方式

lemon_xhr的博客 365

js 使ajax变异步为同步

[code="java"] $.ajax({ //ajax异步变为同步 type: 'post', //POST方式发送数据 async: false //ajax同步 }); [/code]

Jack 361
下一篇: symbian 隐藏程序图标和 运行状态
皓浩
博客等级 码龄18年 157粉丝 121原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值