一种资源管理方法及***
技术领域
本发明涉及计算机技术领域,尤其涉及一种资源管理方法及***。
背景技术
随着计算机技术的发展,资源的传输和利用也得到了较大的发展,人们获取的资源也多种多样,上述资源包括视频信息、音频信息或者图片信息等,如何对资源进行管理成为了关键问题。
现有技术采用的方法是让多个模块与资源之间建立一种关联,并对与资源建立关联的模块进行计数,这样上述模块通过建立的关联可以对资源进行共享,包括读取和释放,当资源失效时,每个与该资源进行关联的模块都进行关联解除操作,即与资源建立关联的模块计数为0时,资源占用的内存得以释放。
然而上述方法中,在对资源占用的内存进行释放时,需要每个与该资源进行关联的模块都进行关联解除操作,但是各个模块进行关联解除操作的时间是不确定的,也无法确定最后执行关联解除操作的是哪一个模块,这样会导致资源释放的不确定,而无法有效地对资源进行管理。可见,现有技术中资源管理方法存在局限性。
发明内容
本发明提供一种资源管理方法及***,用以解决现有技术中资源方法中存在的资源释放的不确定性和无法有效管理资源的技术问题。
第一方面,本发明实施例提供了一种资源的管理方法,包括:设置主模块与资源的第一关联,使所述主模块能基于所述第一关联访问所述资源和释放所述资源占用的内存;根据所述第一关联,设置第二关联;将所述第二关联传递给至少一个从模块,使所述从模块能基于所述第二关联访问所述资源。
可选的,在所述设置主模块与资源的第一关联之前,还包括:获取所述资源;将所述资源发送至所述主模块。
可选的,所述设置主模块与资源的第一关联,使所述主模块能基于所述第一关联访问所述资源和释放所述资源占用的内存,包括:判断所述资源是否失效;如果失效,则查看所述资源是否被访问;如果所述资源未被访问,则释放所述资源占用的内存。
可选的,所述释放所述资源占用的内存之后,还包括:解除所述第一关联。
可选的,所述将所述第二关联传递给至少一个从模块,使所述从模块能基于所述第二关联访问所述资源,包括:基于所述第二关联,判断所述第一关联是否被解除;如果未被解除,则访问所述资源。
基于同样的发明构思,本发明实施例提供了一种资源管理***,包括:第一设置模块,用于设置主模块与资源的第一关联,使所述主模块能基于所述第一关联访问所述资源和释放所述资源占用的内存;第二设置模块,用于根据所述第一关联,设置第二关联;传递模块,将所述第二关联传递给至少一个从模块,使所述从模块能基于所述第二关联访问所述资源。
可选的,所述***还包括:第一获取模块,用于获取所述资源;发送模块,用于将所述资源发送至所述主模块。
可选的,所述第一设置模块包括:第一判断单元,用于判断所述资源是否失效;查看单元,用于如果所述资源失效,则查看所述资源是否被访问;释放单元,用于如果所述资源未被访问,则释放所述资源占用的内存。
可选的,所述第一设置模块,还包括:解除单元,解除所述第一关联。
可选的,所述传递模块包括:第二判断单元,用于根据所述第二关联,判断所述第一关联是否被解除;访问单元,用于当所述第一关联是否被解除,则访问所述资源。
本发明实施例中提供的技术方案,至少具有如下技术效果或优点:
在本发明实施例的技术方案中,通过设置主模块与资源的第一关联,使得所述主模块可以基于所述第一关联访问所述资源或释放所述资源占用的内存;并根据所述第一关联,设置第二关联,然后将所述第二关联传递给至少一个从模块,使所述从模块基于所述第二关联访问所述资源。由于在上述技术方案中,由于主模块通过第一关联获得了对资源的访问和释放权限,从模块通过接收主模块传递的基于第一关联设置的第二关联,具有对资源的访问权限,但不具有对资源释放的权限,在对资源的管理中,明确了主模块与从模块对资源的管理权限,主模块和从模块都可以访问资源,只有主模块可以对资源进行释放,所以相对于与现有技术而言,本发明中减少了资源管理的不确定性,可以对资源的进行有效的管理,从而实现对内存的有效管理。
上述说明仅是本发明技术方案的概述,为了能够更清楚了解本发明的技术手段,而可依照说明书的内容予以实施,并且为了让本发明的上述和其它目的、特征和优点能够更明显易懂,以下特举本发明的具体实施方式。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1为现有技术中采用指针的方式管理对象的示意图;
图2为本发明实施例中采用指针的指针方式管理对象的示意图;
图3为本发明实施例中采用指针的指针方式删除对象的示意图;
图4本发明实施例中一种资源的管理方法的流程图;
图5本发明实施例中一种资源的管理***的逻辑结构示意图。
具体实施方式
本发明实施例通过提供一种资源的管理方法及***,解决了现有技术中资源方法中存在的资源释放的不确定性和无法有效管理资源的技术问题,可以实现对资源进行有效管理,并实现对内存的有效管理的技术效果。
本发明实施例中的技术方案,总体思路如下:首先设置主模块与资源的第一关联,使得所述主模块可以基于所述第一关联访问所述资源或释放所述资源占用的第一资源;并根据所述第一关联,设置第二关联,然后将所述第二关联传递给至少一个从模块,使所述从模块基于所述第二关联访问所述资源。
上述方法中,由于主模块通过第一关联获得了对资源的访问和释放权限,从模块通过接收主模块传递的基于第一关联设置的第二关联,具有对资源的访问权限,但不具有对资源释放的权限,在对资源的管理中,明确了主模块与从模块对资源的管理权限,主模块和从模块都可以访问资源,只有主模块可以对资源进行释放,所以相对于与现有技术中,所有模块都对资源有访问和释放权限,且需要所有模块都释放资源才能对资源的内存进行释放而言,本发明中明确了各模块对资源的管理权限,减少了资源释放的不确定性,可以对资源进行有效管理,从而实现对内存进行有效的管理。
为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
实施例一
本实施例提供了一种资源的管理方法,请参考图4,所述方法包括:
S101:设置主模块与资源的第一关联,使所述主模块能基于所述第一关联访问所述资源和释放所述资源占用的内存;
S102:根据所述第一关联,设置第二关联;
S103:将所述第二关联传递给至少一个从模块,使所述从模块能基于所述第二关联访问所述资源。
下面,结合图4详细介绍本发明实施例提供的一种资源管理方法的具体实现步骤:
首先,执行步骤S101,设置主模块与资源的第一关联,使所述主模块能基于所述第一关联访问所述资源和释放所述资源占用的内存。
在本发明实施例中,上述资源可以音频资源、视频资源、图片资源、文字资源等,其中,第一关联是指主模块与资源之间的一种对应关系,使得主模块可以通过上述第一关联,对资源进行访问和释放,其中对资源的访问表示对资源的读取,对资源的释放表示对资源的删除。
接着,执行步骤S102,根据所述第一关联,设置第二关联。
在本发明实施例中,在第一关联的基础上,设置第二关联,即设置另一种对应关系,并与第一关联相关。
然后,执行步骤S103,将所述第二关联传递给至少一个从模块,使所述从模块基于所述第二关联访问所述资源。
在本发明实施例中,建立的第二关联可以传递给多个从模块,这样多个从模块基于第二关联来访问资源,并且各个从模块对资源的访问互不影响,且基于第二关联,从模块获得的仅仅是资源的访问权限。
为了更清楚地说明本发明的一种资源管理的方法,下面结合图1-图3对具体的实现来予以说明。
现有技术中的对资源的管理,一般是采用指针的方式来实现,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向存储存储器中另一个地方的值,如图1所示。
图1的左边为一行简单的c++代码,使用new关键字创建一块整型变量内存空间,并将该存储空间初始化值为10,然后使用整形指针p指向该地址。右边为内存分配图解说,可以看到指针p指向一个地址,该地址为0x00281e08,该地址为一个数值为10的整形变量。在c++中,我们一般都是像上面这样创建一个对象,然后通过对象指针来操作该对象。从而在资源的管理中,可以通过创建一个指针,将该指针指向所述资源,从而模块可以通过上述指针来管理资源。
为了使多个模块可以共享资源,于是在指针的基础上采用智能指针技术来实现,智能指针技术允许多个指针指向同一个对象,并将一个计数器与指向的对象相关联,引用计数跟踪有多少指针共享同一对象,从而可以实现多个模块对资源的共享,但是当资源过期或者无效时,需要释放资源所占的内存时,则每个模块都执行释放操作,当一个模块执行释放操作,引用计数减1直到最后一个模块执行释放操作,到引用计数为0,与资源相关联的模块为0时,资源才能释放,从而资源占用的内存才能释放,然而每个模块执行释放操作的时间是不确定的,这样会导致资源管理释放的不确定,从而产生异常,导致无法对资源进行有效管理。
于是,本发明在上述基础上,采用指针的指针的方式来管理对象,具体参见图2和图3,指针的指针是一种特殊的指针,它表示的是该指针指向的是一个指针,也就是地址。
从图2中,我们可以看到,对指针p取地址,赋给指针的指针pp,此时pp指向p的地址,如果我们需要通过pp访问数值为10的整形变量,则需要两级间接寻址。当另外一个模块或者对象需要使用该整形变量时,我们传递pp,这里把pp_copy赋值为pp,可以看到pp_copy也指向了p的地址。也就是说通过共享p来获取对整形变量的访问,而不是直接共享整形变量的地址。
如图3所示,如果需要释放掉new申请的整型变量的内存空间,则需要把P指向的地址空间赋值为0,则可以看到pp,pp_copy指向的地址空间的值为0;当P指向的地址空间赋值为0后,可以通过pp或者pp_copy获取到该情况,也就是说当释放该内存空间后,所有使用该共享对象的模块和对象都能知道,只需要判断*pp==0是否为真即可。由此可知,通过指针的指针来管理共享对象,可以主动删除通过new操作申请的对象,而共享该对象的模块,都可以知道该对象是否被释放,从而解决前面所提及到的智能指针的存在释放不确定性的问题。
在具体的实现过程中,可以通过c++模板来实现,例如下述代码创建了一个可以实现资源管理的模板shared_r_pp模板,shared_r_pp模板的实现同一般的智能指针的区别在于成员变量的设置和自带的release函数。在该模板中,成员变量包含一个指针_ptr和一个指针的指针_pptr,指针_ptr的作用是为了给_pptr赋值,另外是一个作用是可以用来区分主从关系,release函数给使用者提供主动释放对象的功能。采用shared_r_pp管理共享对象,首先需要new一个对象object,传给shared_r_pp,shared_r_pp的构造函数会对_ptr和_pptr赋值。由于上述使用构造函数构造的shared_r_pp对象,其成员变量_ptr和_pptr都不会为0,而如果是通过拷贝构造函数以及赋值操作符构造的shared_r_pp对象,其成员变量_ptr的会为0,再看看release函数,如果_ptr为0,调用该函数不会真正的释放被管理的共享对象。因此,有上述可知,只有通过构造函数构造的shared_r_pp的对象,才能释放共享对象,而其他通过拷贝构造函数以及赋值操作符获取共享对象的使用权的shared_r_pp对象是不能释放共享对象的,只有读的权限,应用于本发明中的资源的管理中,主模块的第二关联是通过构造函数创建的,它具有释放权限,而传递给从模块的第二关联是通过拷贝构造函数得到的,它不具备释放权限,这样就明确了各模块对资源的管理权限,从而对资源进行有效的管理。下述为shared_r_pp对象的部分实现代码:
可选的,在本发明实施例提供的一种资源管理方法中,在所述设置主模块与资源的第一关联之前,还包括:
获取所述资源;
将所述资源发送至所述主模块。
在本发明的实施例中,所述资源可以为音频资源、视频资源、图片资源、文字资源等,资源的获取可以从网络中获取,也可以从本地设备上获取,对此,本发明不做具体限制。
可选的,在本发明实施例提供的一种资源管理方法中,设置主模块与资源的第一关联,使所述主模块能基于所述第一关联访问所述资源和释放所述资源占用的内存,包括:
判断所述资源是否失效;
如果失效,则查看所述资源是否被访问;
如果所述资源未被访问,则释放所述资源占用的内存。
具体来说,由于资源在实际应用过程中更新较快,有些资源会因为时间、内容等因素而失效,这时需要释放资源,但是由于多个从模块可以访问资源,如果在从模块访问资源时,主模块执行释放资源操作,这样也会导致资源管理的异常,因此为了更好地管理资源,主模块在删除资源占用的内存时,需要先判断资源是否失效,如果失效,则查看资源是否被访问,如果未被访问,这时才释放资源的内存。
在具体的实现过程中,可以通过读写锁的设置来实现对资源的读取和释放,读写锁实际是一种特殊的自旋锁,它把对共享资源的管理分为读者和写者,读者只对共享资源进行读操作,写者则可以对共享资源进行写操作。这种锁相对于自旋锁而言,能提高并发性,因为在多处理器***中,它允许同时有多个读者来访问共享资源。写者是排他性的,一个读写锁同时只能有一个写者或多个读者,但不能同时既有读者又有写者。如果读写锁当前没有读者,也没有写者,那么写者可以立刻获得读写锁,否则它必须自旋在那里,直到没有任何写者或读者。如果读写锁没有写者,那么读者可以立即获得该读写锁,否则读者必须自旋在那里,直到写者释放该读写锁。在本发明中,主模块对资源具有读操作和写操作的权限,而从模块对资源仅有读的权限,可以通过读写锁来实现主模块和从模块对资源的管理。
这里还需要介绍多线程的概念,多线程(Multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的***包括对称多处理机、多核心处理器以及芯片级多处理(Chip-level multithreading)或同时多线程(Simultaneous multithreading)处理器。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫做“多线程处理(Multithreading)”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。在多线程应用中,需要考虑不同线程之间的数据同步和防止死锁。当两个或多个线程之间同时等待对方释放资源的时候就会形成线程之间的死锁。为了防止死锁的发生,需要通过同步来实现线程安全。本发明中,多个从模块就相当于多个线程,通过多线程处理,各个从模块可以通过不同线程之间的数据同步和防止死锁来对资源进行访问。
由上述描述可知,本发明实施例通过建立主模块与资源之间的第一关联,使主模块具有对资源的访问和释放权限,基于第一关联设置第二关联,并通过传递第二关联给从模块,使得从模块具有对资源的访问权限,即主模块与从模块具有对资源的不同管理权限,使得管理权限清晰明确,主模块和从模块都可以访问资源,只有主模块可以对视频资源进行释放,相对于与现有技术而言,本发明中减少了资源释放的不确定性,可以对资源进行有效管理,从而实现对内存的有效管理。
可选的,所述释放所述资源占用的内存之后,还包括:解除所述第一关联。
具体来说,由于设置第一关联的作用的是为了通过第一关联来释放资源所占的内存,而当主模块在释放资源占用的内存后,主模块与资源之间的第一关联也变得没有意义了,因此,需要解除所述第一关联。
可选的,所述将所述第二关联传递给至少一个从模块,使所述从模块能基于所述第二关联访问所述资源,包括:
根据所述第二关联,判断所述第一关联是否被解除;
如果未被解除,则访问所述资源。
具体来说,由于主模块将第二关联传递给了从模块,并且第二关联是基于第一关联设置的,因此从模块可以通过第二关联来判断第一关联的情况,如果第一关联不存在了,则对资源的访问也无意义了,因此,从模块基于所述第二关联访问所述资源时,可以通过基于所述第二关联,判断所述第一关联是否被解除;当第一关联未被解除时,则访问所述资源。
基于同一发明构思,本发明提供了另一实施例,详见实施例二。
实施例二
本实施例提供了一种资源管理***,包括:
第一设置模块201,用于设置主模块与资源的第一关联,使所述主模块能基于所述第一关联访问所述资源和释放所述资源占用的内存;
第二设置模块202,用于根据所述第一关联,设置第二关联;
传递模块203,将所述第二关联传递给至少一个从模块,使所述从模块能基于所述第二关联访问所述资源。
可选的,所述***还包括:
第一获取模块,用于获取所述资源;
发送模块,用于将所述资源发送至所述主模块。
可选的,所述第一设置模块包括:
第一判断单元,用于判断所述资源是否失效;
查看单元,用于如果所述资源失效,则查看所述资源是否被访问;
释放单元,用于如果所述资源未被访问,则释放所述资源占用的内存。
可选的,所述第一设置模块,还包括:
解除单元,解除所述第一关联。
可选的,所述传递模块包括:
第二判断单元,用于根据所述第二关联,判断所述第一关联是否被解除;
访问单元,用于当所述第一关联是否被解除,则访问所述资源。
实施例三
在该实施例中,以视频资源为例,详细介绍本发明的一种资源的管理方法及***。
首先从网络获取一个视频流,该视频流经过解码处理后,需要同时给多个模块处理(每个处理模块都是在不同的线程,且与视频解码也在不同的线程),例如渲染、打水印后写文件、写入共享内存供其他进程使用等,为了方便描述,这里的将以两个渲染模块为例,来介绍视频的资源的处理过程,主模块为解码模块,从模块为两个渲染模块,从网络中获取的视频流,解码模块负责对视频流进行解码,渲染模块对视频进行预览。首先关于视频流的获取,先获取流地址,关于流地址可以通过向网站服务器查询获取,然后使用FFmpeg库的avformat_open_input函数打开该流地址,并使用av_read_frame函数获取音视频流数据。FFmpeg(Fast ForwardMoving Picture Experts Group)是一个开源免费跨平台的视频和音频流方案,它提供了录制、转换以及流化音视频的完整解决方案。并包含了非常先进的音频/视频编解码库libavcodec,在本发明实施例中需要用到的是FFMPEG进行视频流的获取以及解码。由于此处只需要视频数据,因此解析流的时候,要获取视频音频的stream的id,然后在读帧的时候,使用帧的streamid进行比较进行判断,如果是音频帧,直接pass,获取的视频数据包直接传递给解码模块。
第一设置模块,用于设置主模块与资源的第一关联,使所述主模块能基于所述第一关联访问所述资源和释放所述资源占用的内存;
具体来说,将传递过来的视频数据包使用avcodec_decode_video2解码,并new一个stVideoFrame对象保存该视频帧,然后通过传递stVideoFrame指针使用构造函数创建shared_r_pp对象来管理该视频stVideoFrame对象,由于创建了shared_r_pp对象,其成员变量包含一个指针_ptr,其中上述第一关联可以通过指针_ptr实现,由于此处构造shared_r_pp对象是通过stVideoFrame指针,所以是通过构造函数创建的,_ptr值不为0。并采用list容器保存所有的shared_r_pp对象,这样有利于管理所有new出来的视频stVideoFrame对象。此外解码模块可以创建一个定时器用于定时遍历list容器保存的shared_r_pp对象,并对过期的视频数据进行回收,可以调用shared_r_pp::release函数进行回收,具体步骤为:将所述视频信息分解成视频帧;获取所述视频帧的时间戳;判断所述时间戳是否超过预设时间;如果超过,则释放所述视频帧占用的内存,直到释放的第二资源的内存总和为所述视频信息占用的内存;具体来说,可以根据stVideoFrame::pts与当地时间进行绑定,预设时间本领域技术人员可以根据实际情况设定,例如2秒、3秒等等,超过预设时间就释放视频帧,直到该视频的所有组成视频帧全部释放为止,释放完毕后。stVideoFrame结构定义如下所示:
由上述可知,管理视频数据的stVideoFrame对象的创建和销毁,都在解码模块,解码模块对stVideoFrame对象(即视频资源)申请和释放完全的控制,这样可以使用内存池等更好的内存管理方式,对程序使用的内存的大小也可控制。
第二设置模块,用于根据所述第一关联,设置第二关联;传递模块,将所述第二关联传递给至少一个从模块,使所述从模块能基于所述第二关联访问所述资源。
具体来说,解码模块把解码后的视频数据,通过shared_r_pp对象分别传递给渲染模块(由于此处传递的是shared_r_pp对象,所以渲染模块获得的shared_r_pp对象是通过拷贝构造函数创建的,所以该对象的_ptr值为0),渲染模块也会使用list容器保存接收到的视频shared_r_pp对象,list容器内的视频shared_r_pp对象需要根据stVideoFrame::pts排序。由于渲染模块使用的视频数据还是编码模块new出来的stVideoFrame对象保存的视频数据,即对一帧视频,编码模块和渲染模块使用的都是一份视频数据,没有进行视频帧数据的内存拷贝,减少了内存的使用也提高了性能。
渲染模块根据stVideoFrame::pts即该视频帧的时间戳来决定何时渲染该视频帧。当一帧视频到了渲染的时间,从list容器获取该视频shared_r_pp对象,通过调用shared_r_pp的->操作符检查返回值看是否为0,如果为0则表示该shared_r_pp对象保存的视频帧已经销毁,跳过渲染该帧,不为0则需要渲染该视频帧。可以看到当解码模块销毁视频shared_r_pp对象后,渲染模块也会得知的。另外渲染模块调用shared_r_pp::release函数并不能销毁视频帧,渲染模块对视频shared_r_pp对象只有读的权限。
前述实施例中的资源管理方法的各种变化方式和具体实例同样适用于本实施例的***,通过前述对资源的管理方法的详细描述,本领域技术人员可以清楚的知道本实施例中资源管理***的实施方法,所以为了说明书的简洁,在此不再详述。
本发明实施例中提供的技术方案,至少具有如下技术效果或优点:
在本发明实施例的技术方案中,通过设置主模块与资源的第一关联,使得所述主模块可以基于所述第一关联访问所述资源或释放所述资源占用的内存;并根据所述第一关联,设置第二关联,然后将所述第二关联传递给至少一个从模块,使所述从模块基于所述第二关联访问所述资源。由于在上述技术方案中,由于主模块通过第一关联获得了对资源的访问和释放权限,从模块通过接收主模块传递的基于第一关联设置的第二关联,具有对资源的访问权限,但不具有对资源释放的权限,在对资源的管理中,明确了主模块与从模块对资源的管理权限,主模块和从模块都可以访问资源,只有主模块可以对资源进行释放,所以相对于与现有技术而言,本发明中减少了资源管理的不确定性,可以对资源的进行有效的管理,从而实现对内存的有效管理。
本领域内的技术人员应明白,本发明的实施例可提供为方法、***、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(***)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明实施例进行各种改动和变型而不脱离本发明实施例的精神和范围。这样,倘若本发明实施例的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包含这些改动和变型在内。