CN101770394B - 基于构件接口的异步调用方法 - Google Patents
基于构件接口的异步调用方法 Download PDFInfo
- Publication number
- CN101770394B CN101770394B CN200810208052A CN200810208052A CN101770394B CN 101770394 B CN101770394 B CN 101770394B CN 200810208052 A CN200810208052 A CN 200810208052A CN 200810208052 A CN200810208052 A CN 200810208052A CN 101770394 B CN101770394 B CN 101770394B
- Authority
- CN
- China
- Prior art keywords
- asynchronous
- interface
- member class
- target member
- object instance
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明提供一种基于构件接口的异步调用方法。该方法在目标构件的夹壁墙里将调用信息打包,向目标构件投递一个异步调用消息,然后直接返回调用方。根据异步调用消息,被调用的异步接口方法在调用返回后的某个时机被执行。本发明能够简便可靠地实现基于构件接口的异步调用。
Description
技术领域
本发明涉及一种构件化软件系统中的调用方法,特别是关于一种构件化软件系统中基于构件接口的异步调用方法。
背景技术
异步调用是与同步调用相对的一种调用方式。如果是同步调用,调用方要等待调用任务执行完毕才返回。如果是调用异步,调用方会很快返回,但调用任务未必此时被执行,而是稍后某个时机才被执行。通过异步调用,不需要等待调用任务完成就可以继续执行其他任务。
当调用执行一些比较耗时的操作,例如磁盘读写、网络数据传输时,通常会采用异步调用方式。程序员创建一个工作线程用于等待磁盘读写或网络数据传输,以此来释放CPU,提高CPU的利用率。然而,在现有的技术中,异步调用的实现过程比较复杂。异步调用的实现需要编写大量代码,增加了重复劳动。并且,利用多线程实现异步调用容易出现漏洞,造成一定的安全隐患。这些问题的存在,给构件化软件系统中实现异步调用带来了很大的限制。
发明内容
鉴于以上内容,有必要提供一种简便可靠的基于构件接口的异步调用方法。
一种基于构件接口的异步调用方法,适用于能运行构件化软件系统的数据处理设备,该方法包括步骤:定义目标构件类、该目标构件类的异步接口及该异步接口的方法;创建所述目标构件类的对象实例;调用目标构件类的对象实例的异步接口的方法;该调用进入目标构件类的对象实例的夹壁墙,在目标构件类的对象实例的夹壁墙里将调用信息打包;向目标构件类的对象实例投递一个调用该异步接口方法的异步调用消息,然后直接返回调用方;及根据所述异步调用消息执行该异步接口方法。
本发明可以简化实现异步调用的代码,减少由程序员实现多线程可能带来隐患的风险。对于构件使用者,不必自己创建线程、管理线程,直接调用构件的异步接口就可以实现类似的操作。对于构件实现者,也同样不必管理线程,只要声明异步接口,该接口的实现就会自动以异步方式被调用。本发明简便可靠地实现了基于构件接口的异步调用,给计算机构件化软件系统的进一步发展奠定了基础。
附图说明
图1为本发明基于构件接口的异步调用方法的流程图。
图2为消息队列的循环处理流程。
图3为基于构件接口的异步调用的执行情况示意图。
具体实施方式
本发明利用构件化软件系统的回调机制和构件所特有的夹壁墙技术实现基于构件接口的异步调用。
在构件化软件系统中,已经有了成熟的回调模型,这个模型就是:A向B投递一个调用消息,投递结束即返回;B的循环处理线程发现这个调用消息后会执行相应的操作。
此外,在构件化软件系统中,每个构件都具有夹壁墙,所有对构件方法的调用都会先进入夹壁墙。
当同步调用某个方法时,通过调用栈传递调用信息,该方法执行完成返回调用方。当异步调用某个方法时,会立即返回调用方,调用方也有可能就此结束返回。如果调用方调用该方法时传递的参数位于调用方的栈上,当调用方返回以后,调用方的栈会被释放,如果这时候所调用的方法被执行,对所传递的参数的访问就会成为非法访问,所访问的参数就会成为无效参数。
为了解决这个问题,在夹壁墙里将调用参数等调用信息打包起来,并且保存在一块堆内存上。这样,调用方的调用参数已经被拷贝了一份,即便调用方返回退出也不会影响所调用的方法的运行。
结合回调机制和夹壁墙技术,在本发明中,当调用目标构件异步接口所实现的方法时,在目标构件的夹壁墙里将调用信息进行打包,利用回调机制向目标构件投递一个异步调用消息,然后直接返回调用方,被调用的异步接口所实现的方法将会在调用返回后的某个不能预期的时机被执行,由此实现基于构件接口的异步调用。
参阅图1所示,是构件化软件系统中基于构件接口的异步调用方法的流程图。该方法适用于能运行构件化软件系统的数据处理设备。所述数据处理设备可以是手机、数码相机、个人数字助理(Personal DigitalAssistant,PDA)等电子设备。在本实施例中,所述构件化软件系统是嵌入式操作系统。
步骤S100,定义目标构件类、该目标构件类的异步接口及该异步接口的方法。例如,定义目标构件类CFile,该目标构件类CFile的异步接口IFile,该异步接口IFile的Write方法。
步骤S102,创建所述目标构件类的对象实例(即目标构件)。例如,通过目标构件类CFile的对象指针pFile创建目标构件类的对象实例。
步骤S104,调用目标构件类的对象实例的异步接口的方法。例如,通过目标构件类CFile的对象指针pFile调用Write方法。
步骤S106,该调用进入目标构件类的对象实例的夹壁墙,在目标构件类的对象实例的夹壁墙里将调用信息打包。例如,上面例子中的CFile::Write方法进入夹壁墙CFile::_Write方法里,在CFile::_Write方法里将该调用的调用参数及被调用的接口方法等调用信息进行打包。
步骤S108,向目标构件类的对象实例投递一个调用该异步接口方法的异步调用消息,然后直接返回调用方。例如,在本实施例中,利用回调机制向目标构件类的对象实例投递一个调用Write方法的异步调用消息,然后直接返回调用方。
可以用下面的一段程序代码实现本实施例中目标构件类CFile的夹壁墙的功能:
CFile::_Write(WString name,MemoryBuf*buffer)//夹壁墙函数
{
return PostCallbackEvent(MAKE_PARAMETER(name,buffer,&CFile::Write));//将调用参数打包,并将异步调用消息投递到消息队列
}
ECode PostCallbackEvent(param)
{
return queue.InsertFirst(param);//将调用请求放入消息队列
}
步骤S110,根据所述异步调用消息,在调用返回后的某个时机执行该异步接口方法。在本实施例中,所有构件都运行于某个Applet,这个Applet带有一个消息队列及循环处理线程,所述异步调用消息将被投递到目标构件类的对象实例所属的Applet的消息队列中等待处理。循环处理线程会按顺序逐个处理在消息队列中等待的调用消息,例如所述异步调用消息,直到消息队列为空。从而,所述异步接口方法会在调用返回后的某个时机被执行。例如,如图2所示的消息队列的循环处理流程,该消息队列的循环处理流程包括:步骤S200,接收一个调用消息,例如异步调用消息;及步骤S202,根据该调用消息解析相应的调用信息,并调用相应的接口方法。
步骤S112,在异步接口方法执行完毕后返回执行结果。虽然调用方对目标构件接口的调用是异步的,对调用方来说可能不知道该调用何时被执行,何时被执行完,但是可以利用回调机制获取执行的结果。在本实施例中,CFile提供一个回调接口IFileEvents,当Write方法执行完成时,激发Completed事件,回调回调函数OnCompleted。在调用Write方法之前需要注册Completed事件,将回调函数OnCompleted与Completed事件相关联。
例如,利用下面的代码进行注册,将用户定义的回调函数OnCompleted与Completed事件相关联:
CFile::AddCompletedCallback(pFile,&OnCompleted);
其中,CFile表示要注册哪个构件类的事件,函数名中的Add表示注册操作,函数名中的Completed表示注册哪个事件,函数的第一个参数pFile是一个CFile构件类的对象指针,函数的第二个参数OnCompleted是一个由用户定义的回调函数,当事件发生时这个函数会被调用。
可以根据需要定义回调函数,例如,定义如下的回调函数OnCompleted:
ECode OnCompleted(PVoid pUserData,PInterface pSender,Int32nWrittenBytes)
{
WStringBuf_<256>out;
out<<L“Has written”<<nWrittenBytes<<“Bytes.\n”;
out<<L“Current time is”<<time(0);
CConsole::WriteLine(out);
Return NOERROR;
}
在上述回调函数OnCompleted中,输出实际写入的字节数及异步调用执行完成时的系统时间。因而,当Write方法执行完毕时,可以通过回调函数OnCompleted输出实际写入的字节数及异步调用执行完成时的系统时间。
参阅图3所示,是基于构件接口的异步调用的执行情况示意图。在本实施例中,分别输出异步调用前的系统时间、异步调用返回的系统时间、实际写入的字节数以及调用执行完成时的系统时间。如图所示,异步调用返回的系统时间与异步调用前的系统时间均为1213924589,实际写入的字节数是1048576字节,调用执行完成时的系统时间是1213924624。由此可见,利用上述基于构件接口的异步调用方法能够成功实现异步调用,调用方直接返回,被调用的方法在稍后的某个时机被执行。
下面通过几段代码来说明基于构件接口的异步调用的实现方法。在下面所述的几段代码中,目标构件类是CFile,该目标构件类CFile实现异步接口IFile,该异步接口IFile实现Write方法。
(1)File.car//构件定义文件
Interface IFile{ //定义构件的接口
Write(WString name,MemoryBuf buffer);//声明接口方法
}
Interface IFileEvents{ //定义构件的接口
Completed(Int32writtenBytes); //声明接口方法
}
Class CFile{//定义一个构件类
asynchronous interface IFile;//声明该构件类实现IFile异步接口
callback interface IFileEvents;
//声明该构件类具有IFileEvents回调接口
}
(2)File.cpp//Write方法定义文件
CFile::Write(WString name,MemoryBuf*buffer)
{
WStringBuf_<256>out;
out<<L“Begin writing”<<time(0);
CConsole::WriteLine(out);
FILE*fp=_wfopen(name,“w”);
……
fwrite(buffer->GetPlayload(),1,buffer->GetLength(),fp);
Callback::Completed(nWritten);
……
}
(3)Client.cpp//基于构件接口的异步调用的客户端程序
ECode OnCompleted(PVoid pUserData,PInterface pSender,Int32nWrittenBytes)//定义回调函数
{
WStringBuf_<256>out;
out<<L“Has written”<<nWrittenBytes<<“Bytes.\n”;
out<<L“Current time is”<<time(0);
CConsole::WriteLine(out);
Return NOERROR;
}
ECode ElastosMain(const BufferOf<WString>&wargs)//主程序
{
IFile*pFile;
MemoryBuf_<1048576>buffer;//1MB
WStringBuf_<64>out;
……
CFile::AddCompletedCaIlback(pFile,&OnCompleted);//注册
Completed事件
Time_t begTime=time(0);
pFIle->Write(L“user.dat”,&buffer);//写1MB数据到“user.dat”
Time_t endTime=time(0);
out<<L“Begin time”<<begTime<<“\n”;
out<<L“End time”<<endTime;
CConsole::WriteLine(out);
……
Return NOERROR;
}
根据本发明,如果构件在实现某个接口时包含了比较耗时的操作,可以将该接口声明为异步接口。当该接口的方法被调用时,调用方能够很快地返回,继续后面的操作。
Claims (8)
1.一种基于构件接口的异步调用方法,适用于能运行构件化软件系统的数据处理设备,其特征在于,该方法包括步骤:
定义目标构件类、该目标构件类的异步接口及该异步接口的方法;
创建所述目标构件类的对象实例;
调用目标构件类的对象实例的异步接口的方法;
该调用进入目标构件类的对象实例的夹壁墙,在目标构件类的对象实例的夹壁墙里将调用信息打包;
向目标构件类的对象实例投递一个调用该异步接口的方法的异步调用消息,然后直接返回调用方;及
根据所述异步调用消息执行该异步接口的方法。
2.如权利要求1所述的基于构件接口的异步调用方法,其特征在于,所述构件化软件系统是嵌入式操作系统。
3.如权利要求1所述的基于构件接口的异步调用方法,其特征在于,所述数据处理设备包括手机、数码相机及个人数字助理。
4.如权利要求1所述的基于构件接口的异步调用方法,其特征在于,该方法还包括:
在异步接口的方法执行完毕后返回执行结果。
5.如权利要求4所述的基于构件接口的异步调用方法,其特征在于,所述在异步接口的方法执行完毕后返回执行结果是利用回调机制返回所述执行结果。
6.如权利要求1所述的基于构件接口的异步调用方法,其特征在于,所述向目标构件类的对象实例投递一个调用该异步接口的方法的异步调用消息是利用回调机制投递所述异步调用消息。
7.如权利要求1所述的基于构件接口的异步调用方法,其特征在于,所述向目标构件类的对象实例投递一个调用该异步接口的方法的异步调用消息的步骤中,该异步调用消息被投递到目标构件类的对象实例所属的消息队列中。
8.如权利要求7所述的基于构件接口的异步调用方法,其特征在于,所述消息队列由循环处理线程顺序处理。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200810208052A CN101770394B (zh) | 2008-12-29 | 2008-12-29 | 基于构件接口的异步调用方法 |
HK10109884.8A HK1143437A1 (en) | 2008-12-29 | 2010-10-19 | A method to implement asynchronous interface method invocations in a component based software system |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN200810208052A CN101770394B (zh) | 2008-12-29 | 2008-12-29 | 基于构件接口的异步调用方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN101770394A CN101770394A (zh) | 2010-07-07 |
CN101770394B true CN101770394B (zh) | 2012-10-03 |
Family
ID=42503273
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN200810208052A Expired - Fee Related CN101770394B (zh) | 2008-12-29 | 2008-12-29 | 基于构件接口的异步调用方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN101770394B (zh) |
HK (1) | HK1143437A1 (zh) |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107239276A (zh) * | 2017-05-22 | 2017-10-10 | 广州安圣信息科技有限公司 | 一种基于c语言的异步延时执行方法及执行模块 |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN102567111B (zh) * | 2011-12-23 | 2017-10-27 | 融创天下(上海)科技发展有限公司 | 一种异步过程调用的方法、系统和终端设备 |
CN106371900B (zh) * | 2015-07-23 | 2020-06-05 | 腾讯科技(深圳)有限公司 | 一种实现异步调用的数据处理方法及装置 |
CN107463380B (zh) * | 2017-08-01 | 2018-07-06 | 武汉斗鱼网络科技有限公司 | 消息处理方法、装置及电子设备 |
CN109873863B (zh) * | 2019-01-18 | 2021-10-15 | 北京百度网讯科技有限公司 | 服务的异步调用方法和装置 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1512370A (zh) * | 2002-12-31 | 2004-07-14 | ����̩ƽ | 基于构件的用户自定义事件机制 |
CN1737762A (zh) * | 2004-08-20 | 2006-02-22 | 华为技术有限公司 | 一种对企业级Java组件的方法进行调用的方法 |
CN101021804A (zh) * | 2007-03-13 | 2007-08-22 | 华为技术有限公司 | 调用动态库的方法、装置及动态库服务器 |
CN101154157A (zh) * | 2006-09-29 | 2008-04-02 | 国际商业机器公司 | 为JavaScript应用提供全球化功能的系统和方法 |
CN101196813A (zh) * | 2007-12-26 | 2008-06-11 | 上海科泰世纪科技有限公司 | 计算机软件系统中基于构件接口实现事件回调的方法 |
-
2008
- 2008-12-29 CN CN200810208052A patent/CN101770394B/zh not_active Expired - Fee Related
-
2010
- 2010-10-19 HK HK10109884.8A patent/HK1143437A1/xx not_active IP Right Cessation
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1512370A (zh) * | 2002-12-31 | 2004-07-14 | ����̩ƽ | 基于构件的用户自定义事件机制 |
CN1737762A (zh) * | 2004-08-20 | 2006-02-22 | 华为技术有限公司 | 一种对企业级Java组件的方法进行调用的方法 |
CN101154157A (zh) * | 2006-09-29 | 2008-04-02 | 国际商业机器公司 | 为JavaScript应用提供全球化功能的系统和方法 |
CN101021804A (zh) * | 2007-03-13 | 2007-08-22 | 华为技术有限公司 | 调用动态库的方法、装置及动态库服务器 |
CN101196813A (zh) * | 2007-12-26 | 2008-06-11 | 上海科泰世纪科技有限公司 | 计算机软件系统中基于构件接口实现事件回调的方法 |
Cited By (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN107239276A (zh) * | 2017-05-22 | 2017-10-10 | 广州安圣信息科技有限公司 | 一种基于c语言的异步延时执行方法及执行模块 |
Also Published As
Publication number | Publication date |
---|---|
CN101770394A (zh) | 2010-07-07 |
HK1143437A1 (en) | 2010-12-31 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11915238B2 (en) | Blockchain-implemented systems and methods for concurrent bytecode interpretation | |
WO2018137564A1 (zh) | 一种业务处理方法及装置 | |
US8849753B2 (en) | Automating asynchronous programming in single threaded systems | |
CN101770394B (zh) | 基于构件接口的异步调用方法 | |
CN106415506A (zh) | 用于调用安全区域的面向对象的编组方案 | |
US11422777B2 (en) | System and methods with reduced complexity in the integration of exposed information models with applications | |
WO2022148390A1 (zh) | 一种在区块链中部署、更新、调用智能合约的方法 | |
CN112506492B (zh) | 一种支持动态场景配置的可视化埋点方法 | |
US6205491B1 (en) | Method and apparatus for deferred throwing of exceptions in C++ | |
CN111507676A (zh) | 业务订单流程创建和实现方法、装置、存储介质和系统 | |
CN114925084A (zh) | 分布式事务处理方法、系统、设备及可读存储介质 | |
KR102340881B1 (ko) | 블록체인 기반 IoT 서비스 플랫폼 제공 방법 및 시스템 | |
CN109254856B (zh) | 智能pos服务端提供接口给客户端的方法 | |
US20080127301A1 (en) | Delivering Callbacks Into Secure Application Areas | |
CN115994004A (zh) | 一种应用程序接口调用方法及装置 | |
CN111124627A (zh) | 应用程序的调起者确定方法、装置、终端及存储介质 | |
CN111930478A (zh) | 基于动态字节码的服务调用方法及装置 | |
US7908375B2 (en) | Transparently externalizing plug-in computation to cluster | |
CN113312120B (zh) | 在虚拟机中执行c++任务的方法、装置、电子设备及介质 | |
JP6151946B2 (ja) | 情報処理システム、情報処理装置およびそれらの制御方法 | |
US8839207B2 (en) | Debugging extensible markup language | |
US11947532B2 (en) | Lifecycle tracking of data objects | |
CN117056317B (zh) | 数据处理方法、装置、设备及计算机可读存储介质 | |
US20240160501A1 (en) | Interoperability between actor frameworks and asynchronous frameworks | |
CN115640560A (zh) | 基于sql的数据湖数据开发方法和数据湖数据开发系统 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: DE Ref document number: 1143437 Country of ref document: HK |
|
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
REG | Reference to a national code |
Ref country code: HK Ref legal event code: GR Ref document number: 1143437 Country of ref document: HK |
|
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20121003 Termination date: 20151229 |
|
EXPY | Termination of patent right or utility model |