电子表格中网络函数的异步计算方法及装置与流程

文档序号:14911316发布日期:2018-07-10 23:29阅读:185来源:国知局

本发明涉及电子表格信息处理技术领域,特别是涉及一种电子表格中网络函数的异步计算方法及装置。



背景技术:

在电子表格中,普通的计算流程是由单元格中函数的计算过程组成的,通常函数的计算过程是由一线程按顺序进行函数计算,一个函数计算完成以后,再计算下一个函数。随着电子表格功能的扩展,常会应用到网络函数,而网络函数在计算时,需要通过网络获取计算结果,这就导致网络函数的计算时间是普通函数的计算时间的几十倍甚至上百倍。

可见,在有大量的网络函数被引用的情况下,采用上述普通函数的计算方式,一次计算流程会耗费很长的时间,在操作过程中用户需要长时间等待,用户体验不好。因此,亟需提出一种能够缩短用户等待时间的网络函数的异步计算方法。



技术实现要素:

本发明实施例的目的在于提供一种电子表格中网络函数的异步计算方法及装置,以实现网络函数的异步计算,减少用户等待网络函数返回计算结果的时间,提升用户体验。具体技术方案如下:

一种电子表格中网络函数的异步计算方法,包括:

第一线程获取待计算网络函数的函数信息;

所述第一线程在第一缓存区中查找所述函数信息对应的计算结果;

若未在所述第一缓存区中查找到所述函数信息对应的计算结果,则所述第一线程将所述函数信息存储至第二缓存区;

第二线程从所述第二缓存区获取所述函数信息,根据所述函数信息进行网络函数的计算,将计算结果存储至所述第一缓存区,并启动所述第一线程查找所述函数信息对应的计算结果。

如上所述的方法,其中,所述函数信息包括:函数ID和参数;

所述第一线程获取待计算网络函数的函数信息的步骤,包括:

第一线程在启动后,判断第一脏单元集合中是否存在待计算函数;所述第一脏单元集合中包含待处理的单元格;

若存在,所述第一线程获取所述待计算函数的函数ID和参数;

所述第一线程根据所述函数ID判断所述待计算函数是否为网络函数;

若判断结果为所述待计算函数是网络函数,则所述待计算函数的函数ID和参数为待计算网络函数的函数信息。

如上所述的方法,其中,所述方法还包括:

若在所述第一缓存区中查找到所述函数信息对应的计算结果,则将所述计算结果返回内存;

返回所述第一线程判断第一脏单元集合中是否存在待计算函数的步骤,直至所述第一线程判断所述第一脏单元集合中不存在待计算函数时结束。

如上所述的方法,其中,所述方法还包括:

若所述第一线程判断所述待计算函数不是网络函数,则所述第一线程根据所述函数ID和参数进行函数计算,得到所述待计算函数的计算结果,并将所述计算结果返回内存;

返回所述第一线程判断第一脏单元集合中是否存在待计算函数的步骤,直至所述第一线程判断所述第一脏单元集合中不存在待计算函数时结束。

如上所述的方法,其中,所述第一线程根据所述函数ID判断所述待计算函数是否为网络函数,包括:

所述第一线程根据预设函数ID与标记位映射表,确定与所述待计算函数的函数ID对应的标记位;

所述第一线程根据所述标记位判断所述待计算函数是否为网络函数。

如上所述的方法,其中,所述第二线程从所述第二缓存区获取所述函数信息,根据所述函数信息进行网络函数的计算,将计算结果存储至所述第一缓存区,并启动所述第一线程查找所述函数信息对应的计算结果的步骤,包括:

所述第二线程判断第二缓存区中是否存在所述待计算函数的函数ID和参数;

若存在,则所述第二线程从所述第二缓存区中获取所述函数ID和参数,并将所述待计算函数所在的单元格记录在第二脏单元集合中;

所述第二线程根据所述函数ID和参数进行网络函数的计算,得到计算结果;

所述第二线程将所述计算结果存储至所述第一缓存区;

返回所述判断第二缓存区中是否存在待计算函数的函数ID和参数的步骤,直至所述第二线程判断所述第二缓存区中不存在待计算函数的函数ID和参数,所述第二线程判断所述第一线程是否结束;

若所述第一线程结束,则所述第二线程将所述第二脏单元集合中记录的所述单元格放入第一脏单元集合中;

所述第二线程启动所述第一线程查找所述函数信息对应的计算结果,并进入休眠状态。

如上所述的方法,其中,所述第一线程将所述函数信息存储至第二缓存区之后,还包括:

所述第一线程通过状态标记位判断所述第二线程是否处于休眠状态;

若所述第二线程处于休眠状态,则所述第一线程唤醒所述第二线程。

如上所述的方法,其中,所述第二线程判断所述第一线程是否结束,包括:

所述第二线程判断同步变量是否被标记;

若所述同步变量被标记,则所述第二线程判断所述第一线程未结束;

若所述同步变量未标记,则所述第二线程判断所述第一线程结束。

如上所述的方法,其中,所述第二线程启动所述第一线程,包括:

所述第二线程向所述第一线程发送启动消息,启动所述第一线程。

一种电子表格中网络函数的异步计算装置,包括:

获取模块,用于使用第一线程获取待计算网络函数的函数信息;

查找模块,用于使用所述第一线程在第一缓存区中查找所述函数信息对应的计算结果;

存储模块,用于若所述查找模块未在所述第一缓存区中查找到所述函数信息对应的计算结果,则使用所述第一线程将所述函数信息存储至第二缓存区;

处理模块,用于使用第二线程从所述第二缓存区获取所述函数信息,根据所述函数信息进行网络函数的计算,将计算结果存储至所述第一缓存区,并启动所述第一线程查找所述函数信息对应的计算结果。

如上所述的装置,其中,所述函数信息包括:函数ID和参数;

所述获取模块具体用于:第一线程在启动后,判断第一脏单元集合中是否存在待计算函数;所述第一脏单元集合中包含待处理的单元格;若存在,使用所述第一线程获取所述待计算函数的函数ID和参数;根据所述函数ID判断所述待计算函数是否为网络函数;若判断结果为所述待计算函数是网络函数,则所述待计算函数的函数ID和参数为待计算网络函数的函数信息。

如上所述的装置,其中,所述查找模块还用于:

若在所述第一缓存区中查找到所述函数信息对应的计算结果,则将所述计算结果返回内存;

第一触发模块,用于触发所述获取模块;直至所述获取模块使用所述第一线程判断所述第一脏单元集合中不存在待计算函数时结束。

如上所述的装置,其中,还包括:计算模块;

用于若所述获取模块使用所述第一线程判断所述待计算函数不是网络函数,则使用所述第一线程根据所述函数ID和参数进行函数计算,得到所述待计算函数的计算结果,并将所述计算结果返回内存;

第一触发模块,用于触发所述获取模块;直至所述获取模块使用所述第一线程判断所述第一脏单元集合中不存在待计算函数时结束。

如上所述的装置,其中,所述获取模块具体用于:

使用所述第一线程根据预设函数ID与标记位映射表,确定与所述待计算函数的函数ID对应的标记位;根据所述标记位判断所述待计算函数是否为网络函数。

如上所述的装置,其中,所述处理模块用于:

使用所述第二线程判断第二缓存区中是否存在所述待计算函数的函数ID和参数;若存在,则从所述第二缓存区中获取所述函数ID和参数,并将所述待计算函数所在的单元格记录在第二脏单元集合中;根据所述函数ID和参数进行网络函数的计算,得到计算结果;将所述计算结果存储至所述第一缓存区;

第二触发模块,用于触发所述处理模块;直至所述处理模块使用所述第二线程判断所述第二缓存区中不存在待计算函数的函数ID和参数;

所述处理模块使用所述第二线程判断所述第一线程是否结束;若所述第一线程结束,则将所述第二脏单元集合中记录的所述单元格放入第一脏单元集合中;启动所述第一线程查找所述函数信息对应的计算结果,并进入休眠状态。

如上所述的装置,其中,还包括:

第一判断模块,用于使用所述第一线程通过状态标记位判断所述第二线程是否处于休眠状态;

唤醒模块,用于若所述第一判断模块判断所述第二线程处于休眠状态,则使用所述第一线程唤醒所述第二线程。

如上所述的装置,其中,还包括:第二判断模块:

用于使用所述第二线程判断同步变量是否被标记;若所述同步变量被标记,则判断所述第一线程未结束;若所述同步变量未标记,则判断所述第一线程结束。

如上所述的装置,其中,所述处理模块具体用于:

使用所述第二线程向所述第一线程发送启动消息,启动所述第一线程。

本发明实施例提供的电子表格中网络函数的异步计算方法及装置,通过第一线程获取待计算网络函数的函数信息;所述第一线程在第一缓存区中查找所述函数信息对应的计算结果;若未在所述第一缓存区中查找到所述函数信息对应的计算结果,则所述第一线程将所述函数信息存储至第二缓存区;第二线程从所述第二缓存区获取所述函数信息,根据所述函数信息进行网络函数的计算,将计算结果存储至所述第一缓存区,并启动所述第一线程查找所述函数信息对应的计算结果。

如此,第一线程在计算过程中,若遇到待计算网络函数,则唤醒第二线程对待计算网络函数进行计算,第二线程完成网络函数的计算后,启动第一线程在第一缓存区中查找与函数信息对应的计算结果,从而实现了网络函数的异步计算,减少用户等待网络函数返回计算结果的时间,提升用户体验。当然,实施本发明的任一产品或方法必不一定需要同时达到以上所述的所有优点。

附图说明

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

图1为本发明实施例提供的电子表格中网络函数的异步计算方法的流程图;

图2为本发明实施例一提供的电子表格中网络函数的异步计算装置的结构示意图;

图3为本发明实施例二提供的电子表格中网络函数的异步计算装置的结构示意图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

首先需要说明的是,在本发明各实施例中,设置一个或者多个常驻线程,为了简单起见,在本发明各实施例中以一个线程为例进行说明,专门用来计算网络函数。本发明各实施例中用于计算普通函数的线程称之为第一线程,用S表示,用于计算网络函数的线程称之为第二线程,用T表示。另外,本发明各实施例中,还设置了第一缓存区用于存储网络函数的计算结果,第二缓存区用来存储需要计算的网络函数的函数信息。

下面结合附图对本发明各实施例提供的电子表格中网络函数的异步计算方法进行说明。

图1为本发明实施例提供的电子表格中网络函数的异步计算方法的流程图。如图1所示,本实施例提供的方法可以包括:

步骤101、第一线程获取待计算网络函数的函数信息。

具体的,所述函数信息包括:函数ID和参数;本步骤中,在获取所述待计算网络函数的函数信息时,所述第一线程在启动后,判断第一脏单元集合中是否存在待计算函数;所述第一脏单元集合中包含待处理的单元格;若存在,所述第一线程获取所述待计算函数的函数ID和参数;所述第一线程根据所述函数ID判断所述待计算函数是否为网络函数;若判断结果为所述待计算函数是网络函数,则所述待计算函数的函数ID和参数为待计算网络函数的函数信息。

具体的,第一线程S可以被第二线程T启动,也可以被用户操作启动,如通过用户更改单元格、改变电子表格的配置等操作启动。

所述第一线程在判断所述待计算函数是否为网络函数时,首先根据预设函数ID与标记位映射表,确定出与所述待计算函数的函数ID对应的标记位,然后根据所确定的标记位判断所述待计算函数是否为网络函数,所述标记位用于标记所述待计算函数的类型。

需要说明的是,若所述第一线程判断所述待计算函数不是网络函数,则所述第一线程根据所述函数ID和参数进行函数计算,得到所述待计算函数的计算结果,并将所述计算结果返回内存;返回所述第一线程判断第一脏单元集合中是否存在待计算函数的步骤,直至所述第一线程判断所述第一脏单元集合中不存在待计算函数时结束。

步骤102、所述第一线程在第一缓存区中查找所述函数信息对应的计算结果。

在实际应用中,若所述第一线程在所述第一缓存区中查找到所述函数信息对应的计算结果,则将所述计算结果返回内存,并返回所述第一线程判断第一脏单元集合中是否存在待计算函数的步骤,直至所述第一线程判断所述第一脏单元集合中不存在待计算函数时结束。

步骤103、若未在所述第一缓存区中查找到所述函数信息对应的计算结果,则所述第一线程将所述函数信息存储至第二缓存区。

所述第一线程将所述函数信息存储至第二缓存区之后,通过状态标记位判断所述第二线程是否处于休眠状态;若所述第二线程处于休眠状态,则所述第一线程唤醒所述第二线程。

需要说明的是,所述状态标记位与所述第二线程的句柄放在一个数据结构里。在本实施例中,通过调用Windows系统的系统函数ResumeThread来唤醒所述第二线程。

步骤104、第二线程从所述第二缓存区获取所述函数信息,根据所述函数信息进行网络函数的计算,将计算结果存储至所述第一缓存区,并启动所述第一线程查找所述函数信息对应的计算结果。

本步骤中,所述第二线程首先需要判断第二缓存区中是否存在所述待计算函数的函数ID和参数;若存在,则所述第二线程从所述第二缓存区中获取所述函数ID和参数,并将所述待计算函数所在的单元格记录在第二脏单元集合中;所述第二线程根据所述函数ID和参数进行网络函数的计算,得到计算结果;并所述计算结果存储至所述第一缓存区;返回所述判断第二缓存区中是否存在待计算函数的函数ID和参数的步骤,直至所述第二线程判断所述第二缓存区中不存在待计算函数的函数ID和参数,所述第二线程判断所述第一线程是否结束。

另外,也可能会出现所述第一线程和所述第二线程同时访问所述第二脏单元格集合的情况,因此设置同步锁,这样同一时刻只随机允许其中一个线程更改所述第二脏单元格集合。因此,本步骤中,所述第二线程判断所述第一线程是否结束包括:所述第二线程判断同步变量是否被标记;若所述同步变量被标记,则所述第二线程判断所述第一线程未结束;若所述同步变量未标记,则所述第二线程判断所述第一线程结束。

在本实施例中,采用的是一种比较耗费CPU的方法,使用一个线程同步变量,所述第一线程在开始计算的时候标记一下,在计算结束的时候将标记去掉;所述第二线程在完成网络函数计算后,每隔一秒钟去检查所述同步变量,如果所述同步变量被标记了就继续每隔一秒钟检查一次,如果所述同步变量没有被标记,则可以判断所述第一线程结束了。

若所述第一线程结束,则所述第二线程将所述第二脏单元集合中记录的所述单元格放入第一脏单元集合中;启动所述第一线程查找所述函数信息对应的计算结果,并进入休眠状态。

需要说的是,所述第一线程通常是主线程,主线程会根据消息队列的不同的消息来调用不同的流程,如计算流程,在本实施例中,所述第二线程通过向所述第一线程的消息队列发送启动消息,启动所述第一线程。

在实际应用过程中,所述第一线程在计算前会有一次扩散的过程,例如单元格A1引用的公式是=A2,A2引用的公式是=1,当用户将A2更改为=2的时候,是只将A2添加到第一脏单元集合中的,所述第一线程计算前的扩散会将A1也加入第一脏单元集合中,这个是WPS电子表格现有的机制,此处不再赘述。

在实际应用中还可能会出现所述第一线程唤醒所述第二线程,所述第二线程启动所述第一线程,所述第一线程再唤醒所述第二线程这种循环启动(唤醒)的情况,因此,在本实施例中,对于这种循环启动(唤醒)添加次数限制,例如7次,如果超过这个次数限制,则令所述第一线程在计算网络函数的过程中不再启动所述第二线程,而是直接等待所述第二线程对于网络函数的计算结果。

综上所述,实际应用中,上述流程可以分为两个部分:

第一部分:第二线程T启动即进入休眠状态。第二线程T被第一线程S唤醒以后,查看第二缓存区C2中是否有函数信息,如果第二缓存区C2中有函数信息,即待计算函数的函数ID和参数,则取出函数ID和参数进行网络函数的计算,并将计算结果以及函数ID和参数放入第一缓存区C1中。如此往复,直到第二缓存区C2中没有待计算函数的函数ID和参数。等待第一线程S结束后,将第二脏单元集合TD记录的单元格放入第一脏单元集合SD中,启动一次第一线程S,并进入休眠状态。

第二部分:在第一线程S的计算过程中,如果遇到网络函数,则首先通过网络函数的函数ID和参数在第一缓存区C1中查找是否有对应的计算结果,如果能找到,则直接将计算结果返回内存;如果找不到,则将函数ID和参数放入第二缓存区C2中,判断第二线程T是否处于休眠状态,如果第二线程T在休眠的状态下,唤醒第二线程T,由第二脏单元集合TD记录正在运算的单元格,计算结果返回一个错误值,其中,错误值指的是电子表格中#VALUE!#NUM!之类的值,将该值当成函数的计算结果返回给第一线程S让它当成正常的计算结果,继续进行下一个函数的计算。需要说明的是,该错误值返回至内存,在电子表格显示时,会从内存中取这些数据绘制到显示屏幕上。

在本实施例提供的电子表格中网络函数的异步计算方法中,第一线程获取待计算网络函数的函数信息;所述第一线程在第一缓存区中查找所述函数信息对应的计算结果;若未在所述第一缓存区中查找到所述函数信息对应的计算结果,则所述第一线程将所述函数信息存储至第二缓存区;第二线程从所述第二缓存区获取所述函数信息,根据所述函数信息进行网络函数的计算,将计算结果存储至所述第一缓存区,并启动所述第一线程查找所述函数信息对应的计算结果。如此,第一线程在计算过程中,若遇到待计算网络函数,则唤醒第二线程对待计算网络函数进行计算,第二线程完成网络函数的计算后,启动第一线程在第一缓存区中查找与函数信息对应的计算结果,从而实现了网络函数的异步计算,减少用户等待网络函数返回计算结果的时间,提升用户体验。

图2为本发明实施例一提供的电子表格中网络函数的异步计算装置的结构示意图。如图2所示,本实施例提供的装置可以包括:获取模块21、查找模块22、存储模块23和处理模块24。

其中,获取模块21,用于使用第一线程获取待计算网络函数的函数信息;

查找模块22,用于使用所述第一线程在第一缓存区中查找所述函数信息对应的计算结果;

存储模块23,用于若所述查找模块22未在所述第一缓存区中查找到所述函数信息对应的计算结果,则使用所述第一线程将所述函数信息存储至第二缓存区;

处理模块24,用于使用第二线程从所述第二缓存区获取所述函数信息,根据所述函数信息进行网络函数的计算,将计算结果存储至所述第一缓存区,并启动所述第一线程查找所述函数信息对应的计算结果。

具体的,所述函数信息包括:函数ID和参数;所述获取模块21具体用于:第一线程在启动后,判断第一脏单元集合中是否存在待计算函数;所述第一脏单元集合中包含待处理的单元格;若存在,使用所述第一线程获取所述待计算函数的函数ID和参数;根据所述函数ID判断所述待计算函数是否为网络函数;若判断结果为所述待计算函数是网络函数,则所述待计算函数的函数ID和参数为待计算网络函数的函数信息。

进一步的,所述查找模块22还用于:若在所述第一缓存区中查找到所述函数信息对应的计算结果,则将所述计算结果返回内存;如图3所示,本实施例提供的装置还包括第一触发模块31,用于触发所述获取模块21;直至所述获取模块21使用所述第一线程判断所述第一脏单元集合中不存在待计算函数时结束。

进一步的,本实施例提供的装置还包括:计算模块32;用于若所述获取模块21使用所述第一线程判断所述待计算函数不是网络函数,则使用所述第一线程根据所述函数ID和参数进行函数计算,得到所述待计算函数的计算结果,并将所述计算结果返回内存;第一触发模块31,用于触发所述获取模块21;直至所述获取模块21使用所述第一线程判断所述第一脏单元集合中不存在待计算函数时结束。

所述获取模块21具体用于:使用所述第一线程根据预设函数ID与标记位映射表,确定与所述待计算函数的函数ID对应的标记位;根据所述标记位判断所述待计算函数是否为网络函数。

所述处理模块24用于:使用所述第二线程判断第二缓存区中是否存在所述待计算函数的函数ID和参数;若存在,则从所述第二缓存区中获取所述函数ID和参数,并将所述待计算函数所在的单元格记录在第二脏单元集合中;根据所述函数ID和参数进行网络函数的计算,得到计算结果;将所述计算结果存储至所述第一缓存区;所述第二触发模块32,用于触发所述处理模块24;直至所述处理模块24使用所述第二线程判断所述第二缓存区中不存在待计算函数的函数ID和参数;所述处理模块24使用所述第二线程判断所述第一线程是否结束;若所述第一线程结束,则将所述第二脏单元集合中记录的所述单元格放入第一脏单元集合中;启动所述第一线程查找所述函数信息对应的计算结果,并进入休眠状态。

所述装置还包括:第一判断模块34,用于使用所述第一线程通过状态标记位判断所述第二线程是否处于休眠状态;唤醒模块35,用于若所述第一判断模块34判断所述第二线程处于休眠状态,则使用所述第一线程唤醒所述第二线程。

所述装置还包括所述第二判断模块36,用于使用所述第二线程判断同步变量是否被标记;若所述同步变量被标记,则判断所述第一线程未结束;若所述同步变量未标记,则判断所述第一线程结束。

所述处理模块24具体用于:使用所述第二线程向所述第一线程发送启动消息,启动所述第一线程。

本实施例提供电子表格中网络函数的异步计算装置,可用于执行上述方法实施例的技术方案,其实现原理和技术效果类似,此处不再赘述。

需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。

本说明书中的各个实施例均采用相关的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。

以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。

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