本申请涉及计算机技术领域,尤其涉及一种窗口检测方法、装置、设备及存储介质。
背景技术:
在线程运行过程中,由于计算机等设备的内存通道占用过大,或窗口显示时间过长,或窗口数据量过大会导致窗口卡死现象,出现窗口卡死现象时会严重影响窗口对应的应用程序的运行。
目前采用周期性定时查询的方法查询窗口是否发生卡死的现象,但是这种方法中查询周期设置较长时,不能及时检测到窗口卡死,查询周期设置较短则目标窗口会由于接收大量消息而影响性能。
技术实现要素:
本申请实施例提供一种窗口检测方法、装置、设备及存储介质,用以优化窗口卡死的检测过程。
本申请第一方面,提供一种窗口检测方法,包括:
确定当前检测时间和目标窗口最近发送的连接消息的发送时间;
确定所述发送时间与所述当前检测时间之间的时间差;
根据所述时间差确定所述目标窗口是否卡死。
本申请第二方面,提供一种窗口检测装置,该装置包括:
检测时间确定单元,用于确定当前检测时间和目标窗口最近发送的连接消息的发送时间;
时间差确定单元,用于确定所述发送时间与所述当前检测时间之间的时间差;
窗口卡死判断单元,用于根据所述时间差确定所述目标窗口是否卡死。
在一种可能的实现方式中,所述发送时间为所述连接消息的接收时间;或者所述发送时间为所述连接消息中携带的时间戳对应的时间。
在一种可能的实现方式中,所述窗口卡死判断单元具体用于:
若确定所述时间差超过第一设定时长,则确定所述目标窗口卡死;或者
若确定所述时间差超过第二设定时长且小于第一设定时长,则确定所述目标窗口卡顿。
在一种可能的实现方式中,所述窗口卡死判断单元还用于:
确定所述时间差超过第一设定时长之后,向所述目标窗口发送检测消息;
若在发送所述检测消息后的第三设定时长内,未接收到所述目标窗口反馈的响应消息,则确定所述目标窗口卡死。
在一种可能的实现方式中,所述窗口卡死判断单元用于:
通过预设功能函数sendmessagetimeout向所述目标窗口发送空消息wm_null,以指示所述目标窗口反馈所述响应消息。
本申请第三方面提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现第一方面及一种可能的实施方式中任一所述的方法。
第四方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,当所述计算机指令在计算机上运行时,使得计算机执行如第一方面及一种可能的实施方式中任一所述的方法。
本申请实施例至少带来以下有益效果:
本申请的方案中,根据目标窗口主动发送的连接消息判断目标窗口是否卡死,能够在不影响目标窗口性能的情况下,便捷及时地发现卡死的目标窗口;且将目标窗口周期性发送的连接消息和后台检测线程发送检测消息结合,能提高判断窗口是否卡死的准确度。
附图说明
图1为本申请实施例提供的一种窗口检测方法中目标窗口和后台检测线程交互过程的示意图;
图2为本申请实施例提供的一种目标窗口是否卡死的过程示意图;
图3为本申请实施例提供的一种根据心跳信息判断目标窗口是否卡死的流过程示意图;
图4为本申请实施例提供的一种根据心跳消息以及检测消息判断目标窗口是否卡死的流过程示意图;
图5为本申请实施例提供的一种窗口检测装置;
图6为本申请实施例提供的一种可进行窗口检测的终端的结构图。
具体实施方式
为了更好的理解本申请实施例提供的技术方案,下面将结合说明书附图以及具体的实施方式进行详细的说明。
为了便于本领域技术人员更好地理解本申请的技术方案,下面对本申请涉及的技术术语进行说明。
窗口:是应用程序运行时的用户界面(userinterface,ui)中最重要的部分,它可以是任何类型的屏幕对象,是屏幕上与一个应用程序相对应的矩形区域,包括框架和客户区,是用户与产生该窗口的应用程序之间的可视界面。当用户开始运行一个窗口的应用程序时,应用程序就会在屏幕上创建并显示一个窗口;当用户操作窗口中的对象时,应用程序响应用户的操作。
windows消息:指操作系统发出的一个通知,告诉某个应用程序发生了某个事件;上述事件可以包括单击鼠标、改变窗口尺寸、按下键盘上的一个按键等;上述任何一个事件都会使应用系统发送一个window消息给应用程序,上述window消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息。
定时器:一段用于产生定时时间的应用程序,其可通过应用程序编程接口(applicationprogramminginterface,api)函数设定,以达到定时触发某事件或运行某段应用程序的目的。
线程:是操作系统中能够独立调度和分派的基本单元,一个线程可以创建并运行一个或多个窗口。
sendmessagetimeout:是一个功能函数,可以将指定的消息发送到一个或多个窗口,此函数为指定的串口调用窗口的应用程序,且若指定的窗口属于不同的线程,直到窗口程序处理完消息或指定的超时周期结束函数才返回;如果接收消息的窗口和当前线程属于同一个队列,窗口程序立即调用,超时则无用。
下面对本申请的设计思想进行说明。
现有技术常采用定时查询的方法后台检测线程是否卡死,该方法中在目标窗口的后台检测线程中设置定时器,定时器中设置有查询周期,在时间达到查询周期时,触发后向目标窗口发送检测消息,若发出检测消息后较长时间内未收到目标窗口的响应消息,则判定目标窗口卡死,但上述方法中,查询周期设置过长则无法及时发现卡死窗口,查询周期过短则会向目标窗口发送大量的检测消息,目标窗口会由于接收大量检测消息而影响自身的性能。
鉴于此,发明人设计了一种窗口检测方法、装置、设备及存储介质,该方法中后台检测线程接收目标窗口发送的连接消息,确定当前检测时间和目标窗口最近发送的连接消息的发送时间,并确定上述发送时间和当前检测时间的时间差,根据上述时间差判断目标窗口是否卡死。
进一步地,考虑到能更及时地检测到目标窗口的状态,申请人设计目标窗口可以周期性地向后台检测线程发送心跳消息作为上述连接消息,后台检测线程可以根据目标窗口的心跳消息的发送时间以及当前检测时间,去判断目标窗口是否发生卡死,其中,上述当前检测时间可以是后台检测线程周期性确定的时间。
应当说明的是,本申请中检测目标窗口是否卡死的执行体,可以是目标窗口对应的应用程序所在的后台检测线程或进程,本领域的技术人员可根据实际需求设置。
以下结合附图对本申请的内容做进一步说明。
本实施例提供一种窗口检测方法,以下从目标窗口和后台检测线程交互过程进行详细说明,如图1所示,具体如下步骤:
步骤s101,目标窗口向后台检测线程发送连接消息。
目标窗口可以在启动后或者触发上报窗口状态时,主动向后台检测线程发送连接消息,以向后台检测线程指示目标窗口的状态,其中目标窗口的状态可能为卡死、卡顿或正常,上述窗口的状态为正常时指窗口未发生卡死或卡顿。
目标窗口可以周期性地发送连接消息,如根据第一设定周期,周期性发送心跳消息作为上述连接消息。
可选地,目标窗口发送连接消息时,可以将创建或发送连接消息的时间作为时间戳添加到连接消息中,与连接消息一起发送。
对上述第一设定周期不做过多限定,本领域的技术人员可根据实际需求设置,如将上述第一设定周期设置为100毫秒等。
步骤s102,后台检测线程接收目标窗口发送的连接消息。
后台检测线程可以实时地接收连接消息,也可以周期性接收连接消息,如以大于第一设定周期的时间周期,周期性接收连接消息等。
步骤s103,后台检测线程确定当前检测时间,以及目标窗口最近发送的连接消息的发送时间。
本实施例中,定义检测目标窗口是否卡死的时间为检测时间,可以将检测时间设置为周期性的,上述当前检测时间为当前检测目标窗口是否卡死的检测时间,可选地,可以根据第二预设周期,周期性地确定当前检测时间。
对上述第二设定周期不做过多限定,本领域的技术人员可根据实际需求设置,如将上述第二设定周期设置为10000毫秒,此时表示当前检测时间与下一检测时间的时间差为10000毫秒。
后台检测线程在确定当前检测时间时,确定在当前检测时间之前最新接收到的连接消息,并确定最新接收到的连接消息的发送时间,其中,后台检测线程可以将上述连接消息的接收时间作为其发送时间,也可以将上述连接消息中携带的时间戳对应的时间作为其发送时间。
步骤s104,后台检测线程确定目标窗口最近发送的连接消息的发送时间与当前检测时间的时间差。
步骤s105,后台检测线程根据上述时间差确定目标窗口是否卡死。
本步骤中,在确定目标窗口是否卡死时,可能出现如下确定结果:
第一种结果:确定目标窗口卡死
上述时间差超过第一设定时长,则确定上述目标窗口卡死。
可以根据目标窗口发送连接消息的第一设定周期设定上述第一设定时长,如将上述第一设定周期设置为100毫秒,将第一设定时长设置为10000毫秒,或者其他的实际需求设置上述第一设定时长。
第二种结果:确定目标窗口卡顿
上述时间差超过第二设定时长且小于第一设定时长,则确定上述目标窗口卡顿。
可以根据上述第一设定周期以及第一设定时长设置第二设定时长,如将上述第一设定周期设置为100毫秒,将第一设定时长设置为10000毫秒,将上述第二设定时长设置为6000毫秒。
考虑到目标窗口发送连接消息以及后台检测线程接收连接消息都可能存在时间延迟的问题,设置的上述第二设定时长不宜与第一设定周期的大小太接近。
第三种结果:确定目标窗口正常
考虑到目标窗口发送连接消息以及后台检测线程接收连接消息都可能存在时间延迟的问题,上述时间差不超过第二设定时长时,则可以确定该目标窗口正常。
应当说明的是,上述步骤s101以及s102与步骤s103并无严格的先后顺序。
在上述步骤s101中,为了达到使目标窗口周期性发送连接消息的目的,可以在目标窗口中设置第一定时器,在第一定时器中设置第一设定周期,以使目标窗口在根据第一定时器,周期性地发送连接消息。
可选地,可以通过应用程序编程接口(applicationprogramminginterface,api)函数如settimer设定第一定时器,如可以按照添加settimer(hwnd,1,uimsecinterval,null)格式,在目标窗口对应的应用程序中设置第一定时器,其中:
第一个参数hwnd是目标窗口的消息处理程序接收定时消息wm_timer的窗口标识,即目标窗口的标识。
第二个参数1是定时器的身份标识,它是一个非0数值,如设置第一定时器时,可将其设置为1。
第三个参数uimsecinterval指的是定时器中的设定时长,也就是每隔设定时长触发一次事件,其可以是一个32位无正负号整数,以毫秒为单位;如在设定第一定时器时,将uimsecinterval的值为100,即表示目标窗口每隔100毫秒发送一次连接消息。
第四个参数为一个回调函数,可以将其设置为null,也就是使用操作系统默认的回调函数,系统默认的回调函数为定时器函数(ontimer函数)。
同理,在上述步骤s103中,为了使后台检测线程能够根据第二设定时长确定当前检测时间,可以在后台检测线程中设置第二定时器。
其中,具体可在目标窗口对应的应用程序中添加settimer(执行体标识1,1,100,null)创建第一定时器,其中执行体标识1为目标窗口的标识,1为第一定时器的身份标识,100表示触发第一定时器的设定时长为100毫秒,即为上述第一设定时长的数值;在后台检测线程中添加settimer(执行体标识2,2,10000,null)创建第二定时器,其中窗口标识2为后台检测线程的标识,2为第二定时器的身份标识,10000表示触发第二定时器的设定时长为10000毫秒,即为上述第二设定时长的数值。
进一步地,在上述步骤s105中,后台检测线程确定上述时间差超过第一设定时长后,还可以结合检测消息去判断目标窗口是否卡死,如图2所示,具体包括:
在上述步骤s104后,还包括:
后台检测线程确定上述时间差超过第一设定时长,向目标窗口发送检测消息。
可选地,后台检测线程可以通过预设功能函数sendmessagetimeout向上述目标窗口发送空消息wm_null,以指示上述目标窗口反馈上述响应消息。
后台检测线程若在发送上述检测消息后的第三设定时长内,未接收到上述目标窗口反馈的响应消息,则确定上述目标窗口卡死,其中,后台检测线程可以通过在sendmessagetimeout中将超时时间设置为第三设定时长,当sendmessagetimeout超时未接收到目标窗口的响应消息,则确定目标窗口卡死。
如图2所示,在后台检测线程发送检测消息后,在确定目标窗口是否卡死时,也可能出现上述几种确定结果,但是各个确定结果对应的判断条件略有不同,以下对此进行详细叙述:
第一种结果:确定目标窗口卡死
后台检测线程在发送上述检测消息后的第三设定时长内,未接收到目标窗口反馈的响应消息,则确定上述目标窗口卡死。
上述第三设定时长可以与上述第一设定时长相同,也可以不同,本领域的技术人员可根据实际需求设置。
第二种结果:确定目标窗口卡顿
后台检测线程仅在发送检测消息后的第四预设时长外且第三设定时长内,接收到上述目标窗口反馈的响应消息,确定上述目标窗口卡顿。
此种情况下,目标窗口由于卡顿,可能延迟接收检测消息,或延迟发送响应消息,因此,后台检测线程在发送检测消息后,会在一定的时间内接收到响应消息。
第四预设时长应小于第三预设时长,如将第三预设时长设置为10000毫秒时,可以将第四预设时长设置为6000毫秒,但考虑到后台检测线程发送检测消息以及目标窗口接收检测消息可能存在时间延迟,上述第四预设时长不宜设置过小。
第三种结果:确定目标窗口正常
后台检测线程在发送检测消息后的第四预设时长内,接收到上述目标窗口反馈的响应消息,确定上述目标窗口未发生卡顿或卡死。
目标窗口若正常,则能及时地接收到检测消息,并及时的反馈响应消息,但考虑到后台检测线程发送检测消息以及目标窗口接收检测消息可能存在时间延迟,因此后台检测线程在发送检测消息后的第四预设时长内接收到响应消息,可以认为目标窗口正常。
为了便于理解本实施例的方案,以下提供2个进行窗口检测的示意性的示例:
示例1
本示例中,以目标窗户的应用程序所在的后台检测线程作为检测窗口的执行体,其中后台检测线程根据目标窗口周期性发送的心跳消息,判断目标窗口是否卡死,如图3所示,具体包括:
在目标窗口设置第一定时器,用于周期性发送心跳消息,在后台检测线程设置第二定时器,用于周期性确定当前检测时间;第一设定时长设置为10000毫秒;其中,第一定时器的第一设定时长设置为100毫秒,,第二定时器的第二设定时长设置为1000毫秒。
目标窗口在通过getmessage函数接收操作系统的队列消息时,触发第一定时器,每隔100毫秒向后台检测线程发送一个心跳消息。
后台监测线程接收到目标窗口发送的心跳消息并记录心跳消息的时间戳;以及
后台检测线程根据第二定时器,每隔1000毫秒的时间为检测时间,在当前时间为检测时间时检查一次心跳消息;每次检查心跳信息时,若确定当前时间与最近接收的心跳消息的时间戳的时间差大于10000毫秒,则确定目标窗口卡死,若确定当前的检测时间与最近接收的心跳消息的时间戳的时间差不大于10000毫秒,则确定目标窗口未卡死。
示例2
本示例中,以目标窗户对应的程序所在的后台检测线程作为后台检测线程,其中后台检测线程根据检测消息结合目标窗口周期性发送的心跳消息,判断目标窗口是否卡死,如图4所示,具体包括:
根据上述示例1的内容,后台检测线程确定当前的检测时间与最近接收的心跳消息的时间戳的时间差大于10000毫秒之后,确定目标窗口可能卡死,进而按照如下方式进一步确定目标窗口是否卡死:
后台检测线程通过预设功能函数sendmessagetimeout向上述目标窗口发送空消息wm_null,并判断发送检测消息后的第三设定时长内,是否接收到目标窗口反馈的响应消息,其中本示例中的第三设定时长可以为10000毫秒。
若后台检测线程在发送上述检测消息后的第三设定时长内,未接收到上述目标窗口反馈的响应消息,则确定上述目标窗口卡死;若在发送上述检测消息后的第三设定时长内,接收到上述目标窗口反馈的响应消息,则确定目标窗口未卡死。
本申请提供的方法中,不会由于第一设定时长的大小影响目标窗口的性能,且通过目标窗口主动发送心跳消息的形式判断目标窗口是否卡死更便捷及时,同时,本申请中后台检测线程在确定超过第一设定时长未接收到心跳消息后,进一步根据检测消息判断目标窗口是否卡死,提高了判断目标窗口卡死的准确度。
如图5所示,基于同一技术构思,本申请实施例还提供一种窗口检测装置500,该装置包括:
检测时间确定单元501,用于确定当前检测时间和目标窗口最近发送的连接消息的发送时间;
时间差确定单元502,用于确定上述发送时间与上述当前检测时间之间的时间差;
窗口卡死判断单元503,用于根据上述时间差确定上述目标窗口是否卡死。
可选地,上述连接消息包括上述目标窗口根据第一设定周期,周期性发送的心跳消息;
上述当前检测时间是根据第二设定周期,周期性确定的。
可选地,上述发送时间为上述连接消息的接收时间;或者
上述发送时间为上述连接消息中携带的时间戳对应的时间。
可选地,上述窗口卡死判断单元具体用于:
若确定上述时间差超过第一设定时长,则确定上述目标窗口卡死;或者
若确定上述时间差超过第二设定时长且小于第一设定时长,则确定上述目标窗口卡顿。
可选地,上述窗口卡死判断单元还用于:
确定上述时间差超过第一设定时长之后,向上述目标窗口发送检测消息;
若在发送上述检测消息后的第三设定时长内,未接收到上述目标窗口反馈的响应消息,则确定上述目标窗口卡死。
可选地,上述窗口卡死判断单元用于:
通过预设功能函数sendmessagetimeout向上述目标窗口发送空消息wm_null,以指示上述目标窗口反馈上述响应消息。
如图6所示,本公开实施例给出一种可进行窗口检测的终端600,该终端包括:射频(radiofrequency,rf)电路610、电源620、处理器630、存储器640、输入单元650、显示单元660、通信接口670、以及wifi模块680等部件。本领域技术人员可以理解,图6中示出的终端的结构并不构成对终端的限定,本申请实施例提供的终端可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
下面结合图6对上述终端600的各个构成部件进行具体的介绍:
上述rf电路610可用于通信或通话过程中,数据的接收和发送。特别地,上述rf电路610可以接收用户通过智能设备等对目标窗口进行的操作,并发送给上述处理器630处理。通常,上述rf电路610包括但不限于天线、至少一个放大器、收发信机、耦合器、低噪声放大器(lownoiseamplifier,lna)、双工器等。
此外,rf电路610还可以通过无线通信与网络和其他终端通信。上述无线通信可以使用任一通信标准或协议,包括但不限于全球移动通讯系统(globalsystemofmobilecommunication,gsm)、通用分组无线服务(generalpacketradioservice,gprs)、码分多址(codedivisionmultipleaccess,cdma)、宽带码分多址(widebandcodedivisionmultipleaccess,wcdma)、长期演进(longtermevolution,lte)、电子邮件、短消息服务(shortmessagingservice,sms)等。
wifi技术属于短距离无线传输技术,上述终端600通过wifi模块680可以连接接入点(accesspoint,ap),从而实现数据网络的访问。上述wifi模块680可用于通信过程中,数据的接收和发送。
当上述终端600为计算机时,上述终端600可以包含上述通信接口670,还可以包含上述wifi模块680;当上述终端600为平板电脑时,上述终端600可以包含上述wifi模块。
上述存储器640可用于存储软件程序以及模块。上述处理器630通过运行存储在上述存储器640的软件程序以及模块,从而执行上述终端600的各种功能应用以及数据处理,并且当处理器630执行存储器640中的程序代码后,可以实现本公开的部分或全部过程。
在一些实施方式中,上述存储器640可以主要包括存储程序区和存储数据区。其中,存储程序区可存储操作系统、各种应用程序(比如目标窗口对应的应用程序、检测窗口对应的应用程序)以及心跳消息的时间戳等;存储数据区可存储根据上述终端的使用所创建的数据等。
此外,上述存储器640可以包括高速随机存取存储器,还可以包括非易失性存储器,例如至少一个磁盘存储器件、闪存器件、或其他易失性固态存储器件。
上述输入单元650可用于接收用户对目标窗口进行的操作,以及产生与上述终端600功能控制有关的键信号输入。
在一些实施方式中,输入单元650可包括触控面板651以及其他输入设备652。
其中,上述触控面板651,也称为触摸屏,可收用户在其上对目标窗口进行的触摸操作(比如用户使用手指、触笔等任何适合的物体或附件在上述触控面板651上或在上述触控面板651附近的操作),并根据预先设定的程式驱动相应的连接装置。在一些实施方式中,上述触控面板651可以包括触摸检测装置和触摸控制器两个部分。其中,触摸检测装置检测用户的触摸方位,并检测触摸操作带来的信号,将信号传送给触摸控制器;触摸控制器从触摸检测装置上接收触摸信息,并将它转换成触点坐标,再送给上述处理器630,并能接收上述处理器630发来的命令并加以执行。此外,可以采用电阻式、电容式、红外线以及表面声波等多种类型实现上述触控面板651。
在一些实施方式中,上述其他输入设备652可以包括但不限于物理键盘、功能键(比如开关按键等)、轨迹球、鼠标、操作杆等中的一种或多种。
上述显示单元660可用于显示目标窗口以及目标窗口中的各种菜单。上述显示单元660即为上述终端600的显示系统,用于呈现目标窗口及其他人机交互界面,实现人机交互。
进一步的,上述触控面板651可覆盖上述显示面板661,当上述触控面板651检测到在其上或附近的触摸操作后,传送给上述处理器630以确定触摸事件的类型,随后上述处理器630根据触摸事件的类型在上述显示面板661上提供相应的视觉输出。
虽然在图6中,上述触控面板651与上述显示面板661是作为两个独立的部件来实现上述终端600的输入和输入功能,但是在某些实施例中,可以将上述触控面板651与上述显示面板661集成而实现上述终端600的输入和输出功能。
上述处理器630是上述终端600的控制中心,利用各种接口和线路连接各个部件,通过运行或执行存储在上述存储器640内的软件程序和/或模块,以及调用存储在上述存储器640内的数据,执行上述终端600的各种功能和处理数据,从而实现基于上述终端的多种业务。
在一些实施方式中,上述处理器630可包括一个或多个处理器。在一些实施方式中,上述处理器630可集成应用处理器和调制解调处理器,其中,应用处理器主要处理操作系统、目标窗口对应的应用程序,检测窗口对应的应用程序等,调制解调处理器主要处理无线通信。可以理解的是,上述调制解调处理器也可以不集成到上述处理器630中。
上述终端600还包括用于给各个部件供电的电源620(比如电池)。在一些实施方式中,上述电源620可以通过电源管理系统与上述处理器630逻辑相连,从而通过电源管理系统实现管理充电、放电、以及功耗等功能。
尽管未示出,上述终端600还可以包括至少一种传感器、音频电路等,在此不再赘述。
基于同一技术构思,本申请实施例还一种计算机可读存储介质,该计算机可读存储介质存储有计算机指令,当上述计算机指令在计算机上运行时,使得计算机执行如前文论述的窗口检测方法。
尽管已描述了本申请的优选实施例,但本领域内的技术人员一旦得知了基本创造性概念,则可对这些实施例做出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。
显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。