一种定时执行代码的方法及装置与流程

文档序号:15076529发布日期:2018-08-01 01:51阅读:141来源:国知局

本发明涉及应用开发领域,尤其涉及一种定时执行代码的方法及装置。



背景技术:

安卓系统本身拥有一个系统定时器(timer),这个计时器可以以精确时间间隔执行代码。但缺点是系统定时器的代码会在系统的子线程上执行。而在系统子线程上执行的代码不能操作屏幕页面的元素。而现有技术中针对主线程上执行的指定代码,需要通过消息处理器实现,消息处理器是一种可以指定一个延迟时间系统工具,在每次延迟时间结束后,会在系统主线程上执行指定代码,从而对在主线程上执行的指定代码进行循环延迟,但是由于每次执行指定代码所占用时间会有不同,导致主线程循环执行代码时的时间间隔并不是等间隔,从而定时执行代码的延时不精确。



技术实现要素:

本发明实施例通过提供一种定时执行代码的方法及装置,解决了现有技术中定时执行代码的延时不精确的技术问题。

第一方面,本发明实施例提供了一种定时执行代码的方法,包括:

获取主线程当前次执行预指定代码时的实际执行时长;

基于所述实际执行时长对系统消息处理器中的预设固定延时间隔进行修正,以得出用于延迟下一次执行所述预指定代码的单次延时间隔,其中,所述系统消息处理器为针对所述主线程创建;

以所述单次延时间隔进行延时;

在以所述单次延时间隔延时结束时,通过所述主线程进行下一次执行所述预指定代码。

优选的,在所述获取主线程当前次执行预指定代码时的实际执行时长之前,所述方法还包括:

判断所述系统消息处理器是否处于运行状态;

如果所述系统消息处理器处于所述运行状态,执行所述步骤:获取主线程当前次执行预指定代码时的实际执行时长。

优选的,所述判断所述系统消息处理器是否处于运行状态,包括:

判断针对所述系统消息处理器设置的运行时长是否结束,和/或是否已经检测到用户的用于停止所述系统消息处理的结束运行操作。

优选的,所述获取主线程当前次执行预指定代码时的实际执行时长,包括:

记录所述主线程当前次开始执行所述预指定代码时的系统时间戳为当前次执行所述预指定代码的起始时刻;

记录所述主线程当前次执行所述预指定代码结束时的系统时间戳为当前次执行所述预指定代码的结束时刻;

根据所述结束时刻与所述起始时刻计算出所述实际执行时长。

优选的,所述基于所述实际执行时长对系统消息处理器中的预设固定延时间隔进行修正,以得出用于延迟下一次执行所述预指定代码的单次延时间隔,包括:

判断所述实际执行时长是否小于或等于所述预设固定延时间隔;

如果判断出所述实际执行时长小于或等于所述预设固定延时间隔,将所述预设固定延时间隔与所述实际执行时长之差确定为所述单次延时间隔。

优选的,所述基于所述实际执行时长对系统消息处理器中的预设固定延时间隔进行修正,以得出用于延迟下一次执行所述预指定代码的单次延时间隔,还包括:

判断所述实际执行时长是否大于所述预设固定延时间隔;

如果判断出所述实际执行时长大于所述预设固定延时间隔,将所述实际执行时长对所述预设固定延时间隔取余,以得到余数值;

将所述预设固定延时间隔与所述余数值之间的差值确定为所述单次延时间隔。

优选的,所述以所述单次延时间隔进行延时,包括:

通过调用所述系统消息处理器中的预设函数发起以所述单次延时间隔为延时时长的延时指令;

执行所述延时指令进行延时。

第二方面,本发明实施例提供了一种定时执行代码的装置,包括:

代码执行时长获取单元,用于获取主线程当前次执行预指定代码时的实际执行时长;

延时间隔修正单元,用于基于所述实际执行时长对系统消息处理器中的预设固定延时间隔进行修正,以得出用于延迟下一次执行所述预指定代码的单次延时间隔,其中,所述系统消息处理器为针对所述主线程创建;

延时单元,用于以所述单次延时间隔进行延时;

代码执行单元,用于在以所述单次延时间隔延时结束时,通过所述主线程进行下一次执行所述预指定代码。

优选的,所述装置还包括:

运行状态判断单元,用于判断所述系统消息处理器是否处于运行状态;

如果所述系统消息处理器处于所述运行状态,所述代码执行时长获取单元执行所述步骤:获取主线程当前次执行预指定代码时的实际执行时长。

优选的,所述判断所述系统消息处理器是否处于运行状态,包括:

判断针对所述系统消息处理器设置的运行时长是否结束,和/或是否已经检测到用户的用于停止所述系统消息处理的结束运行操作。

优选的,所述代码执行时长获取单元,包括:

起始记录子单元,用于记录所述主线程当前次开始执行所述预指定代码时的系统时间戳为当前次执行所述预指定代码的起始时刻;

结束记录子单元,记录所述主线程当前次执行所述预指定代码结束时的系统时间戳为当前次执行所述预指定代码的结束时刻;

代码执行时长计算子单元,用于根据所述结束时刻与所述起始时刻计算出所述实际执行时长。

优选的,所述延时间隔修正单元,包括:

小于判断子单元,用于判断所述实际执行时长是否小于或等于所述预设固定延时间隔;

第一修正子单元,用于如果判断出所述实际执行时长小于或等于所述预设固定延时间隔,将所述预设固定延时间隔与所述实际执行时长之差确定为所述单次延时间隔。

优选的,所述延时间隔修正单元,还包括:

大于判断子单元,用于判断所述实际执行时长是否大于所述预设固定延时间隔;

取余子单元,用于如果判断出所述实际执行时长大于所述预设固定延时间隔,将所述实际执行时长对所述预设固定延时间隔取余,以得到余数值;

第二修正子单元,用于将所述预设固定延时间隔与所述余数值之间的差值确定为所述单次延时间隔。

优选的,所述延时间隔修正单元,包括:

延时指令发起单元,用于通过调用所述系统消息处理器中的预设函数发起以所述单次延时间隔为延时时长的延时指令;

延时指令执行单元,用于执行所述延时指令进行延时。

本发明实施例中提供的一个或多个技术方案,至少具有如下技术效果或优点:

由于根据主线程当前次执行预指定代码时的实际执行时长对系统消息处理器中的预设固定延时间隔进行修正,以修正后得到单次延时间隔进行延时结束时,再通过主线程进行下一次执行预指定代码。从而使得执行预指定代码时的延时间隔不再是预先固定,而是跟上一次执行预指定代码时的实际执行时长相关,从而动态调整每次执行预指定代码距离上次执行预指定代码的延时间隔,来抵消不同次执行预指定代码时的实际执行时长的不同而造成的延时差异,从而每次执行预指定代码距离上次执行预指定代码精确在同一延时间隔,从而实现了精确等延时间隔执行代码。

附图说明

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

图1为本发明实施例中定时执行代码的方法的流程图;

图2为本发明实施例中定时执行代码的方法应用于安卓系统的细化流程图;

图3为本发明实施例中定时执行代码的装置的结构图。

具体实施方式

本发明实施例通过提供一种定时执行代码的方法及装置,以精确的等时间间隔在主线程中循环执行指定代码,从而解决了现有技术中定时执行代码的延时间隔不精确的技术问题,总体思路如下:

通过执行预指定代码时的实际执行时长动态调整系统消息处理器中的延时间隔,来达到精确延时执行预指定代码的功能。从而每次执行预指定代码距离上次执行预指定代码精确在同一延时间隔,以实现了精确等延时间隔执行代码。

为了更好的理解上述技术方案,下面将结合说明书附图以及具体的实施方式对上述技术方案进行详细的说明。

参考图1所示,本发明实施例提供的定时执行代码的方法,包括如下步骤:

s101、获取主线程当前次执行预指定代码时的实际执行时长;

s102、基于所述实际执行时长对系统消息处理器中的预设固定延时间隔进行修正,以得出用于延迟下一次执行所述预指定代码的单次延时间隔,其中,所述系统消息处理器为针对所述主线程创建;

s103、以所述单次延时间隔进行延时;

s104、在以所述单次延时间隔延时结束时,通过所述主线程进行下一次执行所述预指定代码。

本发明实施例提供的定时执行代码的方法应用于终端设备,该终端设备可以为个人计算、智能终端等,特别应用于分主线程与子线程运行代码的终端设备中。需要说明的是,主线程为在主线程中执行的代码可以操作屏幕页面上的元素的主要线程,子线程为用以执行消耗时间的代码的次要线程,在次要线程中执行的代码不可以操作屏幕页面上的元素。

下面结合图1,对本发明实施例提供的定时执行代码的方法的每个步骤进行详细描述:

首先,执行s101:获取主线程当前次执行预指定代码时的实际执行时长。

具体的,主线程每执行一次预指定代码,就获取当前次执行预指定代码时的实际执行时长。

在一实施例中,通过如下具体步骤s1011~s1013实现获取主线程当前次执行预指定代码时的实际执行时长:

s1011、记录主线程当前次开始执行预指定代码时的系统时间戳为当前次执行预指定代码的起始时刻;

s1012、记录主线程当前次执行预指定代码结束时的系统时间戳为当前次执行预指定代码的结束时刻;

s1013、根据结束时刻与起始时刻计算出实际执行时长。

在具体实施过程中,通过在预指定代码的在前一段代码设置为记录系统时间戳的代码,从而能够获取当前次执行预指定代码的起始时刻;在预指定代码的在后一段代码同样设置为记录系统时间戳的代码,从而能够获取当前次执行预指定代码的结束时刻。

针对安卓系统而言,记录系统时间戳的代码可以为调用system.currenttimemillis()函数,在执行预指定代码之前,通过调用system.currenttimemillis()函数记录下安卓系统的系统时间戳,作为当前次执行预指定代码的起始时刻,在执行预指定代码之后,再次通过调用system.currenttimemillis()函数记录下安卓系统的系统时间戳,作为执行预指定代码的结束时刻。

在s1013中,可以将计算出的结束时刻与起始时刻之差直接确定为当前次执行预指定代码时的实际执行时长。也可以在计算出结束时刻与起始时刻之差后,将结束时刻与起始时刻之差基于预设比例系数进行修正后的值确定为当前次执行预指定代码时的实际执行时长,或者将结束时刻与起始时刻之差基于预设加减系数进行修正后的值确定为当前次执行预指定代码时的实际执行时长。

在一优选实施例中,在获取当前次执行所述预指定代码时的实际执行时长之前,判断系统消息处理器是否处于运行状态;如果系统消息处理器处于运行状态,执行步骤s101:获取主线程当前次执行预指定代码时的实际执行时长,从而能够在循环执行多次预指定代码之后停止。

具体的,判断所述系统消息处理器是否处于运行状态,包括:判断针对系统消息处理器设置的运行时长是否结束,和/或是否已经检测到用户的用于停止所述系统消息处理的结束运行操作。

具体的,设置有用于对系统消息处理器进行定时运行的计时器,在计时器中的定时结束时,表征针对系统消息处理器设置的运行时长结束,则不再执行s101,否则执行s101。

具体的,在用户手动停止系统消息处理器时,会检测到用户的用于停止系统消息处理的结束运行操作,则在执行s101之前已经检测到用户的用于停止系统消息处理的结束运行操作,则不再执行s101,否则执行s101。

在s101之后,接着执行s102:基于实际执行时长对系统消息处理器中的预设固定延时间隔进行修正,以得出用于延迟下一次执行所述预指定代码的单次延时间隔,其中,系统消息处理器为针对所述主线程创建。

在本发明实施例中,先拦截系统消息处理器中的代码执行,再将系统消息处理器中的预设固定时间间隔基于实际执行时长进行修正,以得出针对系统消息处理器的单次延时间隔,从而动态调整系统消息处理器中的延时间隔。

在本发明实施例中,针对每次的实际执行时长的不同,对系统消息处理器中的预设固定延时间隔的修正方式也不相同。

在具体实施过程中,预设固定延时间隔为毫秒级,实际根据用户实际需求进行设置,预设固定延时间隔与预指定代码的代码量正相关,预指定代码的代码量越大,预设固定延时间隔越大,本领域技术人员能够根据这一原理设置系统消息处理器中的预设固定延时间隔。符合这一原理设置的系统消息处理器中的预设固定延时间隔均属于本发明意欲保护的范围。

具体的,判断实际执行时长是否小于或等于预设固定延时间隔;如果实际执行时长小于或等于预设固定延时间隔,将预设固定延时间隔与实际执行时长之差确定为单次延时间隔。

比如,以预设固定延时间隔设置为10毫秒为例,如果当前次执行预指定代码时的实际执行时长小于或等于10毫秒,则将预设固定延时间隔与当前次执行预指定代码时的实际执行时长之差确定用于延迟下一次执行预指定代码的单次延时间隔。

如当前次执行预指定代码时的实际执行时长为8毫秒,8毫秒小于10毫秒,则将10-8=2毫秒确定为用于延迟下一次执行预指定代码的单次延时间隔;如当前次执行预指定代码时的实际执行时长为7毫秒,7毫秒小于10毫秒,则将10-7=3毫秒确定为用于延迟下一次执行预指定代码的单次延时间隔;如当前次执行预指定代码时的实际执行时长为10毫秒,将10-10=0毫秒确定用于延迟下一次执行预指定代码的单次延时间隔,则可以看出,当前次执行预指定代码时的实际执行时长为10毫秒时并没有延时。

具体的,判断实际执行时长是否大于预设固定延时间隔,如果判断出实际执行时长大于预设固定延时间隔,将实际执行时长对预设固定延时间隔取余,以得到余数值;预设固定延时间隔与余数值之间的差值确定为用于延迟下一次执行预指定代码的单次延时间隔。

比如,以预设固定延时间隔设置为10毫秒为例,如果当前次执行预指定代码时的实际执行时长大于10毫秒,则将实际执行时长对预设固定延时间隔取余,以得到余数值;将预设固定延时间隔与余数值之间的差值确定为用于延迟下一次执行预指定代码的单次延时间隔。

如当前次执行预指定代码时的实际执行时长为12毫秒,12毫秒大于10毫秒,则将10-12%10=8毫秒确定为用于延迟下一次执行预指定代码的单次延时间隔;如当前次执行预指定代码时的实际执行时长为14毫秒,14毫秒大于10毫秒,将10-14%10=6毫秒确定为用于延迟下一次执行预指定代码的单次延时间隔。

在s102之后,接着执行s103:以单次延时间隔进行延时。

通过调用系统消息处理器中的预设函数发起以s102得出的单次延时间隔为延时时长的延时指令,执行延时指令进行延时,从而实现统消息处理器针对下一次执行预指定代码延时s102得出的单次延时间隔。

针对在安卓系统中,通过调用系统消息处理器的postdelay()函数,发起延时指令,执行延时指令对下一次执行预指定代码进行延时。

s104、在以单次延时间隔延时结束时,通过主线程进行下一次执行所述预指定代码。

下面,以本发明实施例提供的技术方案应用于安卓系统(android)的终端设备中为例,对本发明实施例进行举例描述:

需要说明的是,操作系统为安卓系统的终端设备上可以有多个子线程和一个主线程,下面参考图2所示,针对安卓系统上的主线程定时执行代码的方法给出一具体实现实施例:

s1:针对安卓系统的主线程创建系统消息处理器;

s2:判断系统消息处理器是否处于运行状态,如果是,执行s3,否则结束;

s3:通过调用system.currenttimemillis()函数记录下安卓系统的系统时间戳作为当前次预指定代码的起始时刻t1i;

s4:执行一次预指定代码;

s5:通过调用system.currenttimemillis()函数记录下安卓系统的系统时间戳作为当前次预指定代码的结束时刻t2i;

s6:将t2i-t1i的结果确定为当前次执行预指定代码时的实际执行时长li;

s7:判断当前次执行预指定代码时的实际执行时长li是否大于预设固定延时间隔tr,如果是则执行s8,否则执行s9;

s8:基于修正公式:tr-li%tr计算出用于延迟下一次执行预指定代码的单次延时间隔tri;

s9:基于修正公式:tr-li,计算出用于延迟下一次执行预指定代码的单次延时间隔tri;

s10:发起以单次延时间隔tri为延时时长的延时指令,以单次延时间隔tri延时结束时返回s2。

需要说明的是,本文中出现的算数符号“%”为取余运算符,本文中出现的术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。另外,本文中字符“/”,一般表示前后关联对象是一种“或”的关系。

基于同一发明构思,本发明另一实施例提供一种实施本发明实施例中定时执行代码的方法的装置,参考图3所示,包括如下结构:

代码执行时长获取单元201,用于获取主线程当前次执行预指定代码时的实际执行时长;

延时间隔修正单元202,用于基于所述实际执行时长对系统消息处理器中的预设固定延时间隔进行修正,以得出用于延迟下一次执行所述预指定代码的单次延时间隔,其中,所述系统消息处理器为针对所述主线程创建;

延时单元203,用于以所述单次延时间隔进行延时;

代码执行单元204,用于在以所述单次延时间隔延时结束时,通过所述主线程进行下一次执行所述预指定代码。

优选的,所述装置还包括:

运行状态判断单元,用于判断所述系统消息处理器是否处于运行状态;

如果所述系统消息处理器处于所述运行状态,所述代码执行时长获取单元201执行所述步骤:获取主线程当前次执行预指定代码时的实际执行时长。

优选的,所述判断所述系统消息处理器是否处于运行状态,包括:

判断针对所述系统消息处理器设置的运行时长是否结束,和/或是否已经检测到用户的用于停止所述系统消息处理的结束运行操作。

优选的,所述代码执行时长获取单元201,包括:

起始记录子单元,用于记录所述主线程当前次开始执行所述预指定代码时的系统时间戳为当前次执行所述预指定代码的起始时刻;

结束记录子单元,记录所述主线程当前次执行所述预指定代码结束时的系统时间戳为当前次执行所述预指定代码的结束时刻;

代码执行时长计算子单元,用于根据所述结束时刻与所述起始时刻计算出所述实际执行时长。

优选的,所述延时间隔修正单元202,包括:

小于判断子单元,用于判断所述实际执行时长是否小于或等于所述预设固定延时间隔;

第一修正子单元,用于如果判断出所述实际执行时长小于或等于所述预设固定延时间隔,将所述预设固定延时间隔与所述实际执行时长之差确定为所述单次延时间隔。

优选的,所述延时间隔修正单元202,还包括:

大于判断子单元,用于判断所述实际执行时长是否大于所述预设固定延时间隔;

取余子单元,用于如果判断出所述实际执行时长大于所述预设固定延时间隔,将所述实际执行时长对所述预设固定延时间隔取余,以得到余数值;

第二修正子单元,用于将所述预设固定延时间隔与所述余数值之间的差值确定为所述单次延时间隔。

优选的,所述延时间隔修正单元202,包括:

延时指令发起单元,用于通过调用所述系统消息处理器中的预设函数发起以所述单次延时间隔为延时时长的延时指令;

延时指令执行单元,用于执行所述延时指令进行延时。

由于本实施例所介绍的装置为实施本发明实施例中定时执行代码的方法所采用的装置,故而基于本发明实施例中所介绍的定时执行代码的方法,本领域所属技术人员能够了解本实施例的装置的具体实施方式以及其各种变化形式,所以在此对于该装置如何实现本发明实施例中的方法不再详细介绍。只要本领域所属技术人员实施本发明实施例中定时执行代码的方法所采用的装置,都属于本发明所欲保护的范围。

上述本发明实施例中的技术方案,至少具有如下的技术效果或优点:

由于根据主线程当前次执行预指定代码时的实际执行时长对系统消息处理器中的预设固定延时间隔进行修正,以修正后得到单次延时间隔进行延时结束时,再通过主线程进行下一次执行预指定代码。从而使得执行预指定代码时的延时间隔不再是预先固定,而是跟上一次执行预指定代码时的实际执行时长相关,从而动态调整每次执行预指定代码距离上次执行预指定代码的延时间隔,来抵消不同次执行预指定代码时的实际执行时长的不同而造成的延时差异,从而实现了每次执行预指定代码距离上次执行预指定代码精确在同一延时间隔,从而实现了精确等延时间隔执行代码。

本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、cd-rom、光学存储器等)上实施的计算机程序产品的形式。

本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。

这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。

这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。

尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。

显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。

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