一种文字处理文档异步加载的方法

文档序号:6354943阅读:394来源:国知局
专利名称:一种文字处理文档异步加载的方法
技术领域
本发明涉及文档处理领域,尤其是一种文字处理文档异步加载的方法。
背景技术
当前,OpenOffice作为跨平台的开源办公软件,已经被广泛使用,其所采用的ODF 文档格式也已经成为文档格式的国际标准。0pen0ffice.org包含了很多组件,其中文字处理组件是非常重要的一个组件,它能够进行文档的各种编辑、读取、保存等操作,不仅能够处理ODF格式的文档,也能够处理包括微软Doc格式在内多种格式的文档。在办公软件处理领域,文件、文档的下达、传阅等占据着办公软件处理的很大比重,这就要求办公软件能够在文档加载方面给用户以很好的体验。然而OpenOffice. org文字处理在加载文档、尤其是较大文档时容易出现加载时间过长、用户需要等待很长时间才能看到文档内容的问题。尤其地,OpenOffice. org文字处理在加载Doc格式的较大文档时,由于采用的是单线程处理方式,总是在所有文档内容都加载完毕以后,才对文档的内容进行统一的显示,这样就导致了加载文档内容的时间有多长用户就需要等多久的问题,在时间过长时,可能会给用户以程序停止响应的感觉。用户在不胜其烦的情况下,有可能没有耐心等待下去,从而会直接结束掉程序。久而久之,用户会难以忍受,从而很有可能放弃使用 OpenOffice。如图1所示,OpenOffice. org文字处理在加载文档时,采用的是单线程处理方式, 最主要的工作就是读取文档内容(步骤S3),在全部读取完毕之后,再对文档内容进行显示 (步骤S4),而显示操作相对于读取操作来说,时间消耗要小的多。之后,用户才能进行浏览和编辑等操作(步骤S5)。在文档内容读取完成之前,用户只能等待。其流程图如图1所示。从单线程处理的角度来说,若要提升性能,就必须优化流程中的各个环节,而除了文档内容加载之外的环节所占处理比重都很小,没有优化的空间和必要;而文档内容加载环节的优化就是过滤器的优化,这一部分涉及内容多,既耗时且短期内也很难有较大改观。

发明内容
基于上述原因,本发明旨在通过修改OpenOffice. org文字处理加载文档的流程来解决该问题,并不需要优化或修改其加载过程的各个环节。本发明通过在文档内容加载的同时显示已加载的内容的方式来解决用户需要一直等待到所有文档内容都解析完毕后才能看到文档内容的问题。本发明的目的是提供一种改变其现有文档加载流程的机制,使用户能够在文档加载的同时实现用户对已加载部分内容的浏览,这样就使用户不用再等待文档的加载完毕, 也就不再关心文档在后台的加载过程。本发明采用的技术手段是本发明以OpenOffice. org文字处理的文档加载流程与多线程技术为基础,通过在原有过滤器加载处抛出加载子线程,将加载过程置于加载子线程中执行,使显示主线程与加载线程同时运行,并添加一定的线程交互处理,其实现的方法包括以下步骤
一、创建一个空的数据框架以便加载时填充相应数据结构,还需要创建所加载文档对应格式的加载过滤器;
二、在对应格式的过滤器初始化并创建完毕之后,即在原主线程中创建文档加载子线程,使显示主线程与加载子线程并行运行;
三、文档异步加载过程,此过程中有加载子线程、创建文档内容视图的主线程及文档控制器三部分操作同时运行,用户可以同时浏览和操作文档,既可以得到不断加载的文档内容,又不会被后台的加载进程影响;
四、文档加载完毕
本发明的有益技术效果在于现有的文档加载方案是以单线程的方式实现的,其中的各个环节是依次执行的,亦即若有其中一个环节花费时间太长,则整个加载时间也一定会很长,尤其在加载较大文档时,会导致用户等待时间太长,甚至有可能会给用户一种程序停止响应的错觉。过滤器从物理媒介读取文档内容的过程正是非常消耗时间的一个环节。本发明采用的多线程异步加载文档的方式,正是将读取文档内容的环节放在一个单独的线程中执行,实现了一边加载文档内容一边对之进行显示。而且,用户在浏览已显示内容的同时,几乎感觉不到程序在后台对剩余内容进行的加载。此方案大大缩短了用户等待文档加载的时间,给用户一种文档瞬间加载完毕的感觉,带来了很好的用户体验效果。


图1为现有文字处理文档加载的流程图; 图2为本发明文字处理文档异步加载的流程图。
具体实施例方式为了使本发明的目的、技术方案及有益效果更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。本发明以OpenOff ice. org文字处理现有的文档加载机制及多线程技术为基础, 通过在原有加载流程基础上抛出文档加载子线程,并将核心加载操作置于子线程中的方式,实现了文档的显示与加载的同步进行。下面结合图2,以对Doc格式文档的加载为例,对OpenOffice. org文字处理的文档异步加载的具体实现作进一步的说明。与单线程进行文档加载时一样,在用户执行打开文档操作时,加载前期的准备工作都是一样的,如图2中所示,需要创建一个空的数据框架以便加载时填充相应数据结构, 还需要创建所加载文档对应格式的加载过滤器(步骤E2)。然后就开始执行文档的异步加载操作,具体步骤如下
(1)在对应格式的过滤器初始化并创建完毕之后,即在原主线程中创建文档加载子线程LoadThread,使显示主线程与加载子线程并行运行,通过CPU的时间片轮转轮流执行(步骤 E3)。现有技术中OpenOffice. org已经实现了多线程操作的类osl Thread,其核心操作run函数以虚函数机制实现,本发明从OpenOff ice. org现有的线程类osl Thread中派生出文档加载子线程类DocLoadThread,并重新定义osl: :Thread的核心操作虚函数run以实现本线程的实际核心操作rim函数。在过滤器创建完成后,本发明具体是通过如下方式创建文档加载子线程 LoadThread 白勺
首先,创建子线程对象,通过执行new DocLoadThreadO操作完成; 其次,准备子线程数据。通过调用线程函数create,为线程分配内存空间以存放其所需要的全局变量等数据,便于与其他线程进行交换;
最后,启动子线程。在执行完创建动作之后,判断创建操作返回的线程指针,若该指针为空,则表示线程创建失败,交由系统处理,否则就表示线程创建成功,通过线程函数osl_ resumeThread启动该线程,通过本线程定义的rim函数开始执行文档加载操作。同时为了该线程的rim函数的执行,从主线程中收集文档加载所需要的过滤器、 所加载文档的路径、存储文档内容的数据流等数据,并将这些数据传递给rim函数中的 LoadDoc函数调用执行文档加载操作。在子线程启动之后,将改变原来单线程时CPU顺序执行所有操作指令的模式,此时将有显示主线程和加载子线程并行执行,CPU将为它们分配轮转时间片,使两个线程按照各自的时间片轮流执行,这就达到了边加载文档内容边显示的技术效果;
(2)文档异步加载过程,此过程中有三部分操作同时运行(步骤E4),具体如下 (I)步骤E41 在异步加载的方案中,将文档加载的核心操作LoadDoc从原加载流程中去除,并将其置于加载子线程LoadThread的核心函数rim函数中执行。rim函数是线程指定的回调函数,是其核心的执行函数,其核心的文档加载操作都将在此函数内完成。 LoadThread子线程在创建完成并启动之后,其核心函数rim函数就开始执行文档加载的操作LoadDoc,逐步进行目录、正文以及页眉页脚等内容的加载;随着文档内容的读取,加载子线程LoadThread不断地将读取到的具体的内容映射到之前构建的数据结构框架,使之逐渐形成完整的文档结构;与此同时,加载子线程根据新读取的内容设置其对应的未格式化标志,即更新标志,而显示主线程会即时查询这些更新标志,如果查询到带有未格式化标志的新内容,就会立即对新内容进行更新显示,并重置新内容的更新标志,标示其已被格式化,具体实现方式如下
1)将单线程中的如下文档加载操作从主线程中移至加载子线程LoadThread中执行 从文档数据流中读取目录内容并通过设定一 Bool变量的值为真来标示目录的存在(步骤 11)、读取文档正文内容(步骤12)、以及读取页眉页脚内容并同样通过Bool变量的值来设定页眉页脚存在的标志(步骤13)。具体做法是,将这些操作从原主线程中移除,并将其放置于子线程的核心函数rim中执行;
2)对应于步骤11,在多线程异步加载的情况下,会发生目录不显示的问题。主显示线程在查询目录是否存在的标志时,文档内容加载线程LoadThread还尚未进行目录的加载, 因此,即便存在目录并在之后设定了标志,主线程也不会再进行目录的显示操作。本操作就是在子线程中所有加载操作完成之后,查询目录是否存在的标志,若有即进行目录的显示, 解决了多线程方案中目录不正常显示的问题(步骤15);
3)对应于步骤13,在多线程异步加载的情况下,会出现页眉页脚显示不出来的问题,原因就是主显示线程中过早的设置了恢复/撤销的标志,导致相应的操作不执行。因此本操作就是在执行页眉页脚的相应显示以前,取消设置的恢复/撤销标志,在页眉页脚显示完毕以后,再将恢复/撤销的标志设置回去,以解决该问题(步骤14)。(II)步骤E42 在LoadThread子线程启动后,主线程继续运行,负责创建文档中现有文档内容的视图,并如异步加载过程中的第(I)部分所述,不断查询子线程内由于不断读取新内容而设置的未格式化的更新标志(步骤16),进行视图的更新,保证文档内容及其视图的同步(步骤21);最后,还要进行页眉页脚的显示。首先,判断当前的恢复/撤销标志是否已设置,由于之前加载子线程已重置了该标志(步骤17),从而根据当前的恢复/撤销标志进行页眉页脚的显示(步骤22);
(III)步骤E43 用户可以同时浏览和操作文档,既可以得到不断加载的文档内容,又不会被后台的加载进程影响,犹如文档已经加载完毕;
(3)在文档异步加载的过程中,由于是多线程的异步加载,就必然涉及到线程之间的交互问题。在本方案中,除了上述步骤中提到的线程间数据传递之外,还包括资源互斥的问题,主要涉及到两种资源一为视图资源,包括页面所占矩形区域、工具栏、状态栏等;二为文档控制器即controller资源,负责文档操作的控制,如文档的加载、保存等操作。文档的基本视图已在一开始由主线程创建完毕,在文档异步加载过程中,部分操作需要更新或修改页面区域或工具栏等,从而会发生两个线程同时修改同一资源数据而引发崩溃或者死锁等问题。文档控制器资源的问题也类似。对以上问题,本发明通过多线程的互斥锁机制加以解决。在多线程处理中,只有拥有互斥锁对象的线程才具有访问资源的权限。由于互斥锁对象只有一个,这就决定了任何情况下此共享资源都不会同时被多个线程所访问。当前占据资源的线程在任务处理完后将拥有的互斥对象交出,其他线程才可以继续访问该共享资源。在本发明中,具体实施方案是,在开始文档加载后,对会被两个线程同时修改的共享资源在子线程内生成互斥锁对象执行lock加锁操作,如上所述,则该共享资源会由子线程独占,主线程将无法访问该资源。这就避免了资源互斥访问的问题。在相应的数据操作执行完之后,在子线程中执行互斥锁对象的unlock解锁,再释放该互斥锁对象,此时此共享资源被释放,其他线程如显示主线程就可以对之访问了。这样就避免了临界资源访问带来的崩溃或者死锁问题。本发明旨在改善用户等待文档加载的时间,使用户在很短的时间内、至少也是在可接受的时间范围内看到文档内容。此方案的实施合理地解决了这一问题,既保证了文档的正常加载,也相比于原来的加载方案,给用户带来了快捷的体验。本发明仅以对Doc格式的文档的加载为例进行说明,事实上所有文字处理相关格式(DOC,DOCX, ODT, UOF等相关格式)文档的加载都在本发明解决的范围内。以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所做的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
权利要求
1.一种文字处理文档异步加载的方法,是使用OpenOffice. org的文字处理组件加载文字处理文档的线程管理方法,其特征是包含以下步骤一、创建一个空的数据框架以便加载时填充相应数据结构,还需要创建所加载文档对应格式的加载过滤器;二、在对应格式的过滤器初始化并创建完毕之后,即在原主线程中创建文档加载子线程,使显示主线程与加载子线程并行运行;三、文档异步加载过程,此过程中有加载子线程、创建文档内容视图的主线程及文档控制三部分操作同时运行,用户可以同时浏览和操作文档,既可以得到不断加载的文档内容, 又不会被后台的加载进程影响;四、文档加载完毕。
2.如权利要求1所述的文字处理文档异步加载的方法,其特征在于,所述加载子线程加载文档的步骤包括从文档数据流中读取目录并设定目录存在的标志;读取文档正文内容;以及,读取页眉页脚内容并设定页眉页脚存在的标志。
3.如权利要求2所述的文字处理文档异步加载的方法,其特征在于,文档加载子线程的创建方法为首先,创建子线程对象,通过执行new DocLoadThreadO操作完成;其次,准备子线程数据,通过调用线程函数create,为线程分配内存空间以存放其所需要的全局变量等数据,便于与其他线程进行交换;最后,启动子线程,在执行完创建动作之后,判断创建操作返回的线程指针,若该指针为空,则表示线程创建失败,交由系统处理,否则就表示线程创建成功,通过线程函数osl_ resumeThread启动该线程,通过本线程定义的rim函数开始执行文档加载操作。
4.如权利要求3所述的文字处理文档异步加载的方法,其特征在于,在步骤三中加载子线程不断地将读取到的具体的内容映射到之前构建的数据结构框架,使之逐渐形成完整的文档结构;与此同时,加载子线程根据新读取的内容设置其对应的未格式化标志,即更新标志,而显示主线程会即时查询这些更新标志,如果查询到带有未格式化标志的新内容,就会立即对新内容进行更新显示,并重置新内容的更新标志,标示其已被格式化。
5.如权利要求4所述的文字处理文档异步加载的方法,其特征在于,在执行页眉页脚的相应显示以前,取消设置的恢复/撤销标志,在页眉页脚显示完毕以后,再将恢复/撤销的标志设置回去。
6.如权利要求4所述的文字处理文档异步加载的方法,其特征在于,在子线程中所有加载操作完成之后,查询目录是否存在的标志,若有,即进行目录的显示。
7.如权利要求1所述的文字处理文档异步加载的方法,其特征在于,在多线程处理中, 只有拥有互斥锁对象的线程才具有访问资源的权限,当前占据资源的线程在任务处理完后将拥有的互斥对象交出,其他线程才可以继续访问该共享资源。
8.如权利要求1-7任一项所述的文字处理文档异步加载的方法,其特征在于,显示主线程与加载子线程并行运行,通过CPU的时间片轮转轮流执行。
9.如权利要求3所述的文字处理文档异步加载的方法,其特征在于,从OpenOffice.org现有的线程类osl:: Thread中派生出文档加载子线程类DocLoadThread,并重新定义 osl-Thread的核心操作虚函数run以实现本线程的实际核心操作run函数。
全文摘要
一种文字处理文档异步加载的方法,是使用OpenOffice.org的文字处理组件加载文字处理文档的线程管理方法,包含步骤一、创建一个空的数据框架以便加载时填充相应数据结构,创建所加载文档对应格式的加载过滤器;二、在对应格式的过滤器初始化并创建完毕之后,即在原主线程中创建文档加载子线程,使显示主线程与加载子线程并行运行;三、文档异步加载过程,此过程中有加载子线程、创建文档内容视图的主线程及文档控制三部分操作同时运行,用户可以同时浏览和操作文档,既可以得到不断加载的文档内容,又不会被后台的加载进程影响。本发明旨在改善用户等待文档加载的时间,使用户在很短的时间内、至少也是在可接受的时间范围内看到文档内容。
文档编号G06F17/21GK102467488SQ201110046018
公开日2012年5月23日 申请日期2011年2月25日 优先权日2011年2月25日
发明者史周波, 夏颖, 李健, 许山川 申请人:中标软件有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1