处理计时器计时异常的方法、装置及计算机可读存储介质与流程

文档序号:11774264阅读:697来源:国知局
处理计时器计时异常的方法、装置及计算机可读存储介质与流程

本发明属于计算机软件领域,尤其涉及一种处理计时器计时异常的方法、装置及计算机可读存储介质。



背景技术:

在计算机软件的事务处理编程中,经常会启用一些计时器来对某个事务的进行时间计时。若超过计时器设定的超时时间,则会处理判断的一个分支,否则,还是停留在原来的事务。显然,在这类事务的编程中,计时器的计时不能出现异常。一旦出现异常,逻辑的执行将会偏离软件开发人员预期的结果。然而,计时器的位元宽度总是有限的(通常是32位字长)、所采用的编程语言的数据宽度也是有限的,因而有可能发生计时器的计时溢出和/或回绕等异常,从而导致超时判断的代码出现判断异常,最终导致程序运行出现异常。

以上问题亟待解决。



技术实现要素:

本发明提供一种处理计时器计时异常的方法、装置及计算机可读存储介质,以防止计时器计时异常导致的程序运行异常。

本发明第一方面提供了一种处理计时器计时异常的方法,包括:

定义一变量t0;

在超时判断这一逻辑的代码执行前,通过调用计时函数将所述计时函数的返回值t’赋给所述变量t0,所述计时函数的返回值t’的数据宽度不大于所述变量t0的数据宽度;

执行防止所述变量t0、所述返回值t’或所述变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作。

本发明第二方面提供了一种处理计时器计时异常的装置,包括:

变量定义模块,用于定义一变量t0;

赋值模块,用于在所述超时判断这一逻辑的代码执行前,通过调用计时函数将所述计时函数的返回值t’赋给所述变量t0,所述计时函数的返回值t’的数据宽度不大于所述变量t0的数据宽度;

执行模块,用于执行防止所述变量t0、所述返回值t’或所述变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作。

本发明实施例的第三方面提供了一种计算设备,包括存储器、处理器以及存储在存储器中并可在处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:

定义一变量t0;

在超时判断这一逻辑的代码执行前,通过调用计时函数将所述计时函数的返回值t’赋给所述变量t0,所述计时函数的返回值t’的数据宽度不大于所述变量t0的数据宽度;

执行防止所述变量t0、所述返回值t’或所述变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作。

本发明实施例的第四方面提供了一种全景图像拼接的计算机可读存储介质,计算机可读存储介质存储有计算机程序,计算机程序被处理器执行时实现以下步骤:

定义一变量t0;

在超时判断这一逻辑的代码执行前,通过调用计时函数将所述计时函数的返回值t’赋给所述变量t0,所述计时函数的返回值t’的数据宽度不大于所述变量t0的数据宽度;

执行防止所述变量t0、所述返回值t’或所述变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作。

从上述本发明提供的技术方案可知,变量t0的定义和赋值都在超时判断这一逻辑的代码执行前实施,与现有技术相比,本发明提供的技术方案执行防止变量t0、返回值t’或变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作,从而能够在计时器发生溢出和/或回绕时仍然可以准确地进行超时判断,使得程序按照正确的逻辑运行。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。

图1是本发明实施例提供的处理计时器计时异常的方法的实现流程示意图;

图2是本发明实施例提供的处理计时器计时异常的装置的结构示意图;

图3是本发明另一实施例提供的处理计时器计时异常的装置的结构示意图;

图4是本发明另一实施例提供的处理计时器计时异常的装置的结构示意图;

图5是本发明实施例提供的计算设备的结构示意图。

具体实施方式

以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本发明实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本发明。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本发明的描述。

为了说明本发明的技术方案,下面通过具体实施例来进行说明。

附图1是本发明实施例提供的处理计时器计时异常的方法的实现流程示意图,主要包括以下步骤s101至s103,详细说明如下:

s101,定义一变量t0。

其中,变量t0可定义在整个程序代码中位于实现超时判断这一逻辑的代码之前的位置。

s102,在超时判断这一逻辑的代码执行前,通过调用计时函数将计时函数的返回值t’赋给变量t0,其中,计时函数的返回值t’的数据宽度不大于变量t0的数据宽度。

在本发明实施例中,可以在定义一变量t0之前,在系统层实现计时函数,以后供后续调用。需要说明的是,为了确保计时精度,在系统层实现计时函数具体可以是采用硬件计时器在系统层实现计时函数;计时函数的返回值用t’表示。

在本发明实施例中,计时函数的返回值t’的数据宽度不大于变量t0的数据宽度;可以将返回值t’和变量t0都定义为无符号长整型。以c语言实现为例,假设计时函数用getelapsedtime()表示,则在程序的代码中,unsignedlongt0和unsignedlonggetelapsedtime()表示将计时函数的返回值t’和变量t0都定义为无符号长整型。例如,假设返回值t’和变量t0的数据宽度为4字节,则计时函数getelapsedtimeo()的返回值t’到达0xffffffff后,再次计时时回绕到0,即,若计时函数getelapsedtimeo()每计时一次,其返回值t’增1,则在返回值t’增加至0xffffffff后,计时函数getelapsedtimeo()再计时时,则计时器溢出,其返回值t’变为0。

s103,执行防止变量t0、返回值t’或变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作。

现有技术中,对于事务处理编程中需要超时判断时,进行超时判断的方法是:先从系统层的计时器中获取当前时间作为起始的计时基准值初值t0;再不断地轮询当前时间是否超过计时基准值t0与指定的超时时限t之和。为了便于说明,以下都统一用t表示计时器设定的超时时限。编程语言c为例,现有技术的实现如下(其中,“//”后的自然语言是对c语言的解释,下同):

#definet9000;//指定的超时时限,9000毫秒;

unsignedlongt0;

t0=gettickcount();//获取程序运行的设备从开机至计时函数被调用时所经历的时长(假设以毫秒为单位),gettickcount()为计时函数,其返回值t’为计时器的计时值;

while(1)

{

if(gettickcount()>t0+t)break;

语句1;

语句2;

}

当计时器不发生溢出和回绕时,上述现有技术提供的超时判断的逻辑不会出现问题。若计时器发生溢出和/或回绕,则判断逻辑将出现异常,以下是计时器发生溢出和/或回绕时导致的两种异常情况:

1)若t0未发生溢出和/或回绕、但t0+t发生溢出和/或回绕时,就会得出误超时的判断,即:while循环刚刚开始,if判断的条件就为真。例如(假设t0和t的数据宽度是4字节无符号整型数,下同):

若t0=0xfffffff0;

t=9000;

则t0+t=8984;//t0+t的值发生溢出,回绕到8984;

假设在while循环判断中,当gettickcount()首次被调用时取值为0xfffffff0,则0xfffffff0>0xfffffff0+9000成立,即按照上述c语言示例的超时判断的方法,if(gettickcount()>t0+t)的条件为“真”,程序判断超时时限到达,使用break语句跳出while循环。然而,实际上计时器的超时时限并未到达,因此,导致了程序的逻辑错误。

2)若t0+t未发生溢出和/或回绕、但循环判断中首次取时值时发生溢出和/或回绕,就会出现迟迟不会超时退出的假死机异常,即:事实上计时器的超时时限已到,if判断的条件仍然为“假”。例如:

若t0=0xfffffff0;

t=10;

则t0+t=0xfffffffa

假设当gettickcount()在循环中首次调用时取值发生溢出,其返回值回绕到0,则0>0xfffffffa不成立,即,按照上述c语言示例的超时判断的方法,if(gettickcount()>t0+t)的条件为“假”,程序判断超时时限尚未到达。此后,需要等到计时器的再次计时到0xfffffffb即gettickcount()的返回值再次变为0xfffffffb时,if(gettickcount()>t0+t)的条件为“真”时,程序才判断超时时限到达,使用break语句跳出while循环。然而,计时器从计时值是0计时到计时值是0xfffffffb,这段时间远远大于指定的超时时限,因而非常漫长,实际上与程序死机的现象类似。

为了解决上述现有技术在超时判断时计时器的溢出和/或回绕导致的程序运行异常,作为本发明一个实施例,执行防止变量t0、返回值t’或变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作可以通过如下步骤s1031和s1032实现:

s1031,循环判断返回值t’与变量t0之差是否大于常量t,其中,常量t为指定的超时时限。

与现有技术类似,在本发明实施例中,计时函数的返回值t’表示从程序运行的设备从开机至该计时函数被调用时所经历的时长。与现有技术不同的是,本发明提供的技术方案循环判断计时函数的返回值t’与变量t0之差是否大于指定的超时时限即常量t,而不是循环判断计时函数的返回值t’是否大于变量t0与常量t之差。

具体地,步骤s1031可通过如下步骤s’1至s’5实现:

s’1,设定循环条件为“真”;

s’2,调用计时函数;

s’3,判断计时函数的返回值t’与变量t0之差是否大于常量t;

s’4,若计时函数的返回值t’与变量t0之差不大于常量t,则执行循环体之内代码对应的逻辑;

s’5,判断循环条件是否为“真”。

s1032,若返回值t’与变量t0之差大于常量t,则跳出循环。

为了便于说明,以c语言的while和if语句实现循环判断为例。

以下是系统层实现计时函数的示例,假设应用层需要毫秒精度的计时函数。示例中的系统层实现了一个计时器中断服务程序,该计时器的计时周期是1毫秒。

以下示例应用层实现超时判断的代码片段:

假设t0没有回绕,且其值为0xfffffff0,即t0=0xfffffff0,而计时函数getelaspedtime()的返回值发生了回绕,假设回绕到1,即getelaspedtime()=1。由于t0和getelaspedtime()的返回值都是4字节无符号长整型,因此,若按照现有技术,if(getelaspedtime()>t+t0)中的判断条件为“假”,即,getelaspedtime()>t+t0不成立,于是仍然执行循环体之内的代码对应的逻辑(即执行语句1、语句2、…),与计时器的超时时限已经到达、程序预期的执行逻辑是跳出while循环不符,而按照本发明提供的技术,if(getelaspedtime()-t0>t)中的判断条件为“真”,即getelaspedtime()-t0>t成立,因此跳出循环while,与计时器的超时时限已经到达,程序预期的执行逻辑是跳出循环相符。

从上述附图1示例的处理计时器计时异常的方法可知,变量t0的定义和赋值都在超时判断这一逻辑的代码执行前实施,与现有技术相比,本发明提供的技术方案执行防止变量t0、返回值t’或变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作,从而能够在计时器发生溢出和/或回绕时仍然可以准确地进行超时判断,使得程序按照正确的逻辑运行。

图2是本发明实施例提供的处理计时器计时异常的装置的示意图,其可以是一计算设备或者其中的功能模块。图2示例的处理计时器计时异常的装置主要包括变量定义模块201、赋值模块202和执行模块203,详细说明如下:

变量定义模块201,用于定义一变量t0,其中,变量t0在整个程序代码中位于实现超时判断这一逻辑的代码之前的位置;

赋值模块202,用于在超时判断这一逻辑的代码执行前,通过调用计时函数将所述计时函数的返回值t’赋给变量t0,其中,计时函数的返回值t’的数据宽度不大于变量t0的数据宽度;

执行模块203,用于执行防止变量t0、返回值t’或变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作。

需要说明的是,本发明实施例提供的装置,由于与本发明方法实施例基于同一构思,其带来的技术效果与本发明方法实施例相同,具体内容可参见本发明方法实施例中的叙述,此处不再赘述。

附图2示例的处理计时器计时异常的装置中,计时函数的返回值t’表示从程序运行的设备从开机至计时函数被调用时所经历的时长,附图2示例的执行模块203包括循环判断单元301和循环跳出单元302,如附图3示例的处理计时器计时异常的装置,其中:

循环判断单元301,用于循环判断计时函数的返回值t’与变量t0之差是否大于常量t,其中,常量t为指定的超时时限;

循环跳出单元302,用于若计时函数的返回值t’与变量t0之差大于常量t,则跳出循环。

附图3示例的循环判断单元301包括设定单元401、调用单元402、第一判断单元403、逻辑执行单元404和第二判断单元405,如附图4示例的处理计时器计时异常的装置,其中:

设定单元401,用于设定循环条件为“真”;

调用单元402,用于调用计时函数;

第一判断单元403,用于判断计时函数的返回值t’与变量t0之差是否大于常量t;

逻辑执行单元404,用于若第一判断单元403的判断结果为计时函数的返回值t’与变量t0之差不大于常量t,则执行循环体之内的代码对应的逻辑;

第二判断单元405,用于判断所述循环条件是否为“真”

图5是本发明一实施例提供的计算设备的结构示意图。如图5所示,该实施例的计算设备5包括:处理器50、存储器51以及存储在存储器51中并可在处理器50上运行的计算机程序52,例如处理计时器计时异常的方法的程序。处理器50执行计算机程序52时实现上述处理计时器计时异常的方法实施例中的步骤,例如图1所示的步骤s101至s103。或者,处理器50执行计算机程序52时实现上述各装置实施例中各模块/单元的功能,例如图2所示变量定义模块201、赋值模块202和执行模块203的功能。

示例性的,处理计时器计时异常的方法的计算机程序52主要包括:定义一变量t0;在所述超时判断这一逻辑的代码执行前,通过调用计时函数将所述计时函数的返回值t’赋给所述变量t0,所述计时函数的返回值t’的数据宽度不大于所述变量t0的数据宽度;执行防止所述变量t0、所述返回值t’或所述变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作。计算机程序52可以被分割成一个或多个模块/单元,一个或者多个模块/单元被存储在存储器51中,并由处理器50执行,以完成本发明。一个或多个模块/单元可以是能够完成特定功能的一系列计算机程序指令段,该指令段用于描述计算机程序52在计算设备5中的执行过程。例如,计算机程序52可以被分割成变量定义模块201、赋值模块202和执行模块203(虚拟装置中的模块),各模块具体功能如下:变量定义模块201,用于定义一变量t0;赋值模块202,用于在所述超时判断这一逻辑的代码执行前,通过调用计时函数将所述计时函数的返回值t’赋给所述变量t0,所述计时函数的返回值t’的数据宽度不大于所述变量t0的数据宽度;执行模块203,用于执行防止所述变量t0、所述返回值t’或所述变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作。

计算设备5可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备。计算设备5可包括但不仅限于处理器50、存储器51。本领域技术人员可以理解,图5仅仅是计算设备5的示例,并不构成对计算设备5的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如终端设备还可以包括输入输出设备、网络接入设备、总线等。

所称处理器50可以是中央处理单元(centralprocessingunit,cpu),还可以是其他通用处理器、数字信号处理器(digitalsignalprocessor,dsp)、专用集成电路(applicationspecificintegratedcircuit,asic)、现成可编程门阵列(field-programmablegatearray,fpga)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

存储器51可以是计算设备5的内部存储单元,例如计算设备5的硬盘或内存。存储器51也可以是计算设备5的外部存储设备,例如计算设备5上配备的插接式硬盘,智能存储卡(smartmediacard,smc),安全数字(securedigital,sd)卡,闪存卡(flashcard)等。进一步地,存储器51还可以既包括计算设备5的内部存储单元也包括外部存储设备。存储器51用于存储计算机程序以及终端设备所需的其他程序和数据。存储器51还可以用于暂时地存储已经输出或者将要输出的数据。

所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上述功能分配由不同的功能单元、模块完成,即将装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本申请的保护范围。上述系统中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

在本发明所提供的实施例中,应该理解到,所揭露的装置/终端设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/终端设备实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。

作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。

另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。

集成的模块/单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,处理计时器计时异常的方法的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤,即,定义一变量t0;在所述超时判断这一逻辑的代码执行前,通过调用计时函数将所述计时函数的返回值t’赋给所述变量t0,所述计时函数的返回值t’的数据宽度不大于所述变量t0的数据宽度;执行防止所述变量t0、所述返回值t’或所述变量t0与返回值t’之和溢出和/或回绕导致逻辑错误的操作。其中,计算机程序包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。计算机可读介质可以包括:能够携带计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1