CN112527627B - 一种页面卡顿检测方法、装置、设备及介质 - Google Patents
一种页面卡顿检测方法、装置、设备及介质 Download PDFInfo
- Publication number
- CN112527627B CN112527627B CN202011204136.6A CN202011204136A CN112527627B CN 112527627 B CN112527627 B CN 112527627B CN 202011204136 A CN202011204136 A CN 202011204136A CN 112527627 B CN112527627 B CN 112527627B
- Authority
- CN
- China
- Prior art keywords
- detection
- thread
- stuck
- information
- task
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
- 238000001514 detection method Methods 0.000 title claims abstract description 475
- 238000000034 method Methods 0.000 claims description 19
- 230000000903 blocking effect Effects 0.000 claims description 7
- 238000000605 extraction Methods 0.000 claims description 4
- 238000012545 processing Methods 0.000 description 7
- 230000006870 function Effects 0.000 description 5
- 238000011161 development Methods 0.000 description 3
- 238000010586 diagram Methods 0.000 description 3
- 238000009877 rendering Methods 0.000 description 3
- 230000005540 biological transmission Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 230000003111 delayed effect Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 238000002955 isolation Methods 0.000 description 1
- 230000009191 jumping Effects 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 230000008707 rearrangement Effects 0.000 description 1
- 238000006467 substitution reaction Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/366—Software debugging using diagnostics
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Debugging And Monitoring (AREA)
- User Interface Of Digital Computer (AREA)
Abstract
本发明实施例公开了一种页面卡顿检测方法、装置、设备及介质,涉及计算机网络技术领域,该页面卡顿检测方法包括:在引擎启动时,依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息;依据检测任务信息,创建目标线程对应的卡顿检测数据对象;在卡顿检测数据对象被卡顿检测线程调用时,获取卡顿检测数据对象的任务计数信息;若任务计数信息满足预设卡顿检测条件,则生成目标线程对应的卡顿检测结果。本发明实施例实现了在卡顿检测线程中添加对目标线程的检测,使得诸如应用程序技术人员等用户可以通过目标线程对应的卡顿检测结果确定出页面卡顿具体是卡在哪一个线程,能够满足Dart页面检测需求。
Description
技术领域
本发明涉及计算机网络技术领域,尤其涉及一种页面卡顿检测方法、装置、设备及介质。
背景技术
随着计算机网络技术的快速发展,提供软件开发的框架越来越多,使开发更具工程性、简便性和稳定性。
例如,一种开源用户界面(User Interface,UI)框架Flutter,可以帮助开发者通过一套代码库高效构建多平台精美应用,如支持移动、全球广域网(World Wide Web,Web)、桌面和嵌入式平台等开发平台。具体的,框架Flutter使用的是计算机编程语言Dart编写业务逻辑。随着业务逻辑的越来越复杂,在某些线上机器上会出现框架Flutter页面流畅度下降,甚至可能发生卡顿的情况,但由于是线上机器,在本地又不好重现,此时若能检测框架Flutter运行的Dart页面卡顿,并定位到页面卡顿的原因,则不仅可以帮助技术人员修复线上问题,还可以方便后续框架Flutter在应用中的推广和落地。
目前,主要是以下两种方式来检测Dart页面的卡顿:第一种是通过框架Flutter自带的开发者性能工具DevTools,检测Dart页面显示的耗时,若Dart页面显示的耗时过大,则认为是卡顿,但这个性能工具DevTools只在调试(Debug)模式和性能(Profile)模式才可以使用,并不能用于线上;第二种是通过Dart页面的帧率来判断是否卡顿,但这样又无法定位页面卡顿是卡在UI线程(Thread)还是图形处理器(Graphics Processing Unit,GPU)线程。由此可见,现有技术没有完善的检测Dart页面卡顿的方法,无法满足Dart页面检测需求。
发明内容
有鉴于此,本发明实施例提供一种页面卡顿检测方法、装置、设备及介质,以实现Dart页面卡顿检测的目的。
第一方面,本发明实施例提供了一种页面卡顿检测方法,包括:
在引擎启动时,依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息;
依据所述检测任务信息,创建所述目标线程对应的卡顿检测数据对象;
在所述卡顿检测数据对象被卡顿检测线程调用时,获取所述卡顿检测数据对象的任务计数信息;
若所述任务计数信息满足预设卡顿检测条件,则生成所述目标线程对应的卡顿检测结果。
第二方面,本发明实施例还提供了一种页面卡顿检测装置,包括:
线程检测任务创建模块,用于在引擎启动时,依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息;
线程数据对象创建模块,用于依据所述检测任务信息,创建所述目标线程对应的卡顿检测数据对象;
任务计数信息获取模块,用于在所述卡顿检测数据对象被卡顿检测线程调用时,获取所述卡顿检测数据对象的任务计数信息;
卡顿检测结果生成模块,用于在所述任务计数信息满足预设卡顿检测条件时,生成所述目标线程对应的卡顿检测结果。
第三方面,本发明实施例还提供了一种页面卡顿检测设备,包括:处理器和存储器;所述存储器中存储有至少一条指令,所述指令由所述处理器执行,使得所述检测设备执行如第一方面所述的页面卡顿检测方法。
第四方面,本发明实施例还提供了一种计算机可读存储介质,所述存储介质中的指令由设备的处理器执行时,使得设备能够执行如第一方面所述的页面卡顿检测方法。
本实施例通过在引擎启动时依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息,并依据该检测任务信息创建目标线程对应的卡顿检测数据对象,从而使得卡顿检测线程可以读取该目标线程对应的卡顿检测数据对象中的信息,进而可以在卡顿检测数据对象被卡顿检测线程调用时通过获取卡顿检测数据对象的任务计数信息来确定确定目标线程是否发生卡顿,即在任务计数信息满足预设卡顿检测条件时生成目标线程对应的卡顿检测结果,即实现了在卡顿检测线程中添加对目标线程的检测,使得诸如应用程序技术人员等用户可以通过目标线程对应的卡顿检测结果确定出页面卡顿具体是卡在哪一个线程,实现了页面卡顿检测的目的,能够满足Dart页面检测需求。
附图说明
图1是本发明实施例的一种页面卡顿检测方法的步骤流程示意图;
图2是本发明一个可选实施例中的一种页面卡顿检测方法的步骤流程示意图;
图3是本发明实施例中的一种页面卡顿检测装置的结构方框示意图。
具体实施方式
下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构或组成。
在具体实现中,框架Flutter主要包括框架(Framework)层、引擎(Engine)层以及嵌入(Embedder)层。其中,Framework层使用纯Dart编写,提供了包括:控件(Widget)、动画、绘制和手势等功能,支持UI界面,可构建Widget控件以及实现UI布局;Engine层使用计算机程序设计语言C++编写,实现了框架Flutter的核心库,包括Dart虚拟机(Virtual Machine,VM)、动画和图形、文字渲染、通信通道、事件通知和插件架构等,在具体实现中,引擎采用的是2D图形渲染库Skia,虚拟机采用的是Dart VM;Embedder层实现了各平台的壳(Shell),即实现各平台中为使用者提供操作页面的软件,主要工作包括渲染Surface的启动,线程启动和系统应用生命周期事件的交互等。
框架Flutter引擎启动时,会创建UI线程、GPU线程和IO线程。其中,UI线程主要用于引擎执行主隔离区(Root Isolate)中的所有Dart代码,将Widget转换生成图层树(LayerTree);GPU线程主要用于将LayerTree转换为具体的GPU指令,将跟设备GPU相关的Skia调用,转换为相应平台的绘制方式;IO线程主要用于处理一些比较耗时的输入/输出(Input/Output,IO)操作任务,如将图片从磁盘中读取,文件操作等。可见,框架Flutter使用Dart编写的页面最终要显示到屏幕上,要通过UI线程将Widget转换成Layter Tree,然后再通过GPU线程将LayerTree渲染出来。只要在UI线程或者GPU线程中任务处理延迟,那就会出现页面卡顿。
为了区分页面卡顿是卡在UI线程还是卡在GPU线程,本发明实施例提出了一种页面卡顿检测方法、装置、设备以及介质。具体的,如图1所示,本发明实施例中的业务卡顿的检测方法具体可以包括如下步骤:
步骤110,在引擎启动时,依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息。
本实施例中,框架配置文件可以是指框架中的配置文件,如可以是框架Flutter中的配置文件,具体可以包括构建框架所需要的所有配置信息,如可以包括创建UI线程和GPU线程所需要的配置信息等,本实施例对此不作具体限制。其中,检测卡顿线程回调信息可以是指检测卡顿线程所能够回传的信息,如可以包括线程类型、线程帐号(IdentityDocument,ID)、线程指针等。
在实际处理中,在引擎启动时,通常会创建UI线程和GPU线程。本实施例可以将引擎创建的UI线程和GPU线程作为目标线程,在引擎启动时,采用检测卡顿线程回调信息创建UI线程和GPU线程各自的检测任务信息,如采用线程类型、线程ID和线程指针去创建各自的框架线程检测实例BSFlutterThreadDetection,以将包含UI线程的框架线程检测实例BSFlutterThreadDetection中的信息确定为UI线程的检测任务信息,并将GPU线程的框架线程检测实例BSFlutterThreadDetection中的信息确定为GPU线程的检测任务信息。
进一步而言,本实施例依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息,具体可以包括:在所述引擎创建目标线程后,从预设的框架配置文件中获取所述目标线程对应的检测卡顿线程回调信息;基于所述目标线程对应的检测卡顿线程回调信息创建所述检测任务信息。具体的,本实施例在引擎启动时,如在框架引擎FlutterEngine创建壳CreateShell时,可以创建UI线程和GPU线程,随后可从预设的框架配置文件中获取UI线程和GPU线程对应的检测卡顿线程回调信息,以分别依据UI线程和GPU线程对应的检测卡顿线程回调信息创建各自的检测任务信息,以便后续卡顿检测线程可以依据该检测任务信息区分监控室UI线程卡顿还是GPU线程卡顿。
在本发明的一个可选实方式中,目标线程可以包含用户界面UI线程和图形处理器GPU线程,本发明实施例基于所述目标线程对应的检测卡顿线程回调信息创建所述检测任务信息,具体可以包括:采用所述UI线程对应的检测卡顿线程回调信息,创建所述UI线程的检测任务信息;采用所述GPU线程对应的检测卡顿线程回调信息,创建所述GPU线程的检测任务信息。
例如,在从框架配置文件中获取UI线程和GPU线程的线程类型、线程ID以及线程指针指标值后,可以分别依据UI线程和GPU线程的线程类型、线程ID以及线程指针指标值创建各自的框架线程检测实例BSFlutterThreadDetection,即依据获取到的UI线程的线程类型、线程ID以及线程指针指标值创建该UI线程的框架线程检测实例BSFlutterThreadDetection,以将该UI线程的框架线程检测实例BSFlutterThreadDetection中所包含的信息确定为UI线程的检测任务信息;并可依据获取到的GPU线程的线程类型、线程ID以及线程指针指标值创建该GPU线程的框架线程检测实例BSFlutterThreadDetection,以将该GPU线程的框架线程检测实例BSFlutterThreadDetection中所包含的信息确定为GPU线程的检测任务信息。需要说明的是,框架线程检测实例BSFlutterThreadDetection可以作为框架系统中的一个类,具体可以用于将引擎里面的UI线程和GPU线程的信息回传给框架配置器BSFlutterConfigure,以通过该框架配置器BSFlutterConfigure将回传的信息存储到配置文件中。其中,框架配置器可以用于维护框架的配置文件。
步骤120,依据所述检测任务信息,创建所述目标线程对应的卡顿检测数据对象。
具体而言,本发明实施例在创建目标线程的检测任务信息后,可以根据该检测任务信息创建目标线程对应的卡顿检测数据对象,从而使得卡顿检测线程可以读取到该卡顿检测数据对象中的信息,实现了在卡顿检测线程中添加对目标线程的检测。其中,卡顿检测线程可以是原生(Native)的主线程卡顿检测方法中新建的一个卡顿检测线程,该卡顿检测线程可按照预设时间间隔定时往主线程发送一个检测任务,如果在预设时间内这个检测任务没有执行完,则可以认为主线程卡顿,如在预设时间为3秒的情况下,卡顿检测线程可以每隔3秒定时往主线程发送一个检测任务,如果在3秒内这个检测任务没有执行完,就可以认为主线程卡顿。
在一个可选实施方式中,本实施例依据所述检测任务信息,创建所述目标线程的对应的卡顿检测数据对象,可以包括:将所述检测任务信息传输给卡顿检测线程;通过所述卡顿检测线程,创建所述目标线程的对应的卡顿检测数据对象。具体的,本实施例在创建出目标线程的检测任务信息后,可以将该检测任务信息传给卡顿检测线程,以触发卡顿检测线程根据该检测任务信息创建出目标线程的对应的卡顿检测数据对象。具体而言,卡顿检测线程在接收到目标线程的检测任务信息后,可以基于该检测任务信息针对目标线程创建相应的卡顿检测数据对象,以将该目标线程的卡顿检测添加到卡顿检测线程中,实现对目标线程的检测。
例如,在创建出UI线程和GPU线程的检测任务信息后,可以将该UI线程和GPU线程的检测任务信息传输给卡顿检测线程BSBlockDetection,使得卡顿检测线程BSBlockDetection会对UI线程和GPU线程创建相应的卡顿检测数据对象BlockDetectionThreadData,以便后续在检测任务超时时可以基于卡顿检测数据对象BlockDetectionThreadData中的线程类型threadType确定出是GPU线程卡顿还是UI线程卡顿,即能够通过卡顿检测线程来检测引擎中的UI线程和GPU线程是否卡顿。需要说明的是,卡顿检测数据对象BlockDetectionThreadData可以作为框架系统中的一个卡顿检测线程数据类,具体可以用于保存从框架配置文件中获取到的检测线程数据,如可以用于保存从框架配置器BSFlutterConfigure回调回来的诸如线程类型、线程ID,任务计数值Count等检测线程数据,且该类可以存储在卡顿检测模块中,本示例对此不作具体限制。
步骤130,在所述卡顿检测数据对象被卡顿检测线程调用时,获取所述卡顿检测数据对象的任务计数信息。
其中,卡顿检测数据对象的任务计数信息可以用于判断该检测卡顿检测数据对象所对应的线程是否发生卡顿。具体而言,本实施例在卡顿检测数据对象被卡顿检测线程调用时,可以通过卡顿检测线程获取该卡顿检测数据对象的任务计数信息,并可通过判断该任务计数信息是否满足预设卡顿检测条件来确定该卡顿检测数据对象对应的目标线程是否发生卡顿,从而可以在卡顿检测数据对象对应的任务计数信息满足预设卡顿检测条件时确定目标线程发生卡顿,即执行步骤140;而在卡顿检测数据对象对应的任务计数信息不满足预设卡顿检测条件时可以确定该目标线程没有发生卡顿。
在一个可选实施方式中,卡顿检测数据对象BlockDetectionThreadData的任务计数信息可以是检测卡顿检测数据对象BlockDetectionThreadData中的一个任务计数值Count。进一步而言,本实施获取所述卡顿检测数据对象的任务计数信息可以包括:从所述卡顿检测数据对象中提取任务计数值,以作为所述任务计数信息。
其中,任务计数值可以表示卡顿检测数据对象被卡顿检测线程调用的计算次数。本实施例可以通过任务计数值是否大于预设卡顿阈值来确定顿检测数据对象对应的线程是否发生卡顿。具体的,本实施例在从所述卡顿检测数据对象中提取任务计数值之后,还可以包括:判断所述任务计数值是否大于预设卡顿阈值;若所述任务计数值大于预设卡顿阈值,则可以确定任务计数信息满足预设卡顿检测条件,随后可跳转到步骤140执行;若所述任务计数值不大于预设卡顿阈值,则依据预设单位变量值对所述任务计数值进行增加,并基于所述卡顿检测数据对象向所述目标线程发送线程释放任务,所述线程释放任务用于对所述任务计数值进行清除。
需要说明的是,预设卡顿阈值可以根据线程卡顿检测需求来设置,如可以设置为3,也可以设置为5等,本实施例对此不作具体限制;预设单位变量值可以是针对任务计数值预先设置的单位变量值,使得任务计数值每次可以按照该单位变量值进行递增,如可以将预设单位变量值设置为1,使得任务计数值每次增加就是加1,本实施例对预设单位变量值的具体数值也不作具体限制。
例如,在卡顿检测线程每次调用卡顿检测数据对象一次时,该卡顿检测数据对象中的任务计数值Count就可以自加1,同时可以向对应线程发送一个计数值清零的任务FlutterThreadReset,以作为线程释放任务,从而可以触发对应线程执行线程释放任务,对任务计数值Count进行清零,达到将该卡顿检测数据对象中的任务计数值Count设置为0的目的。在下一次卡顿检测线程执行时,如果发现卡顿检测数据对象的Count不为0,可以说明上一次的计数值清零任务flutterThreadReset任务没有执行到,随后可以判断该卡顿检测数据对象的任务计数值Count是否大于预设卡顿阈值3;若卡顿检测数据对象的任务计数Count大于预设卡顿阈值3,如在卡顿检测线程发现卡顿检测数据对象BlockDetectionThreadData中的任务计算次数大于3次时,就可以认为对应的检测线程卡顿了,然后执行步骤140。
步骤140,若所述任务计数信息满足预设卡顿检测条件,则生成所述目标线程对应的卡顿检测结果。
具体而言,本实施例在任务计数信息满足预设卡顿检测条件时,可以确定该任务计数信息所对应的目标线程卡顿了,进而可以生成该目标线程对应的卡顿检测结果,使得诸如技术人员等用户可依据该卡顿检测结果确定出页面卡顿是卡在目标线程中,如在卡顿检测结果对应的目标线程为UI线程时,可以依据该卡顿检测结果确定出页面卡顿是由UI线程卡顿导致的,即页面卡顿是卡在UI线程;而在卡顿检测结果对应的目标线程为GPU线程时,可以依据该卡顿检测结果确定出页面卡顿是卡在GPU线程。
综上,本实施例通过在引擎启动时依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息,并依据该检测任务信息创建目标线程对应的卡顿检测数据对象,从而使得卡顿检测线程可以读取该目标线程对应的卡顿检测数据对象中的信息,进而可以在卡顿检测数据对象被卡顿检测线程调用时通过获取卡顿检测数据对象的任务计数信息来确定确定目标线程是否发生卡顿,即在任务计数信息满足预设卡顿检测条件时生成目标线程对应的卡顿检测结果,即实现了在卡顿检测线程中添加对目标线程的检测,使得诸如应用程序技术人员等用户可以通过目标线程对应的卡顿检测结果确定出页面卡顿具体是卡在哪一个线程,如在Dart页面卡顿时能区分是UI thread卡顿还是GPUthread卡顿,即实现了Dart页面卡顿检测的目的,满足Dart页面检测需求。
在实际处理中,框架原生(Native)主线程卡顿检测方法通常是一个卡顿检测线程,该卡顿检测线程可以每隔3s定时往主线程发送一个检测任务,如果3s内这个检测任务没有执行完,就可以认为主线程卡顿了。本发明实施例可以复用Native的卡顿检测线程和卡顿检测任务,在卡顿检测线程中添加对框架引擎的UI线程和GPU线程的检测,从而可以外发到线上检测框架Dart页面卡顿,并可在Dart页面卡顿时区分是UI线程卡顿还是GPU线程卡顿。
在具体实现中,本实施例可以预先在框架配置文件中设置检测线程回调信息,以作为检测卡顿线程回调信息。其中,检测线程回调信息可以是指根据页面卡顿检测需求所确定的各种检测线程所需要回调的线程信息,具体可以包括检测线程可以回传的各种信息,如线程ID、线程类型、线程指针等,本实施例对此不作具体限制。可选的,在上述实施例的基础上,本发明实施例在引擎启动前,还可以包括:确定检测线程回调信息,其中,所述检测线程回调信息包含线程类型、线程帐号和线程指针;将所述检测线程回调信息添加到框架配置文件中,以作为所述检测卡顿线程回调信息。
参照图2,示出了本发明一个可选实施例中的一种页面卡顿检测方法的步骤流程示意图,该页面卡顿检测方法可以适用于检测页面卡顿的情况,具体可以包括如下步骤:
步骤210,确定检测线程回调信息,并将检测线程回调信息添加到框架配置文件中,以作为检测卡顿线程回调信息。
具体而言,本实施例在引擎启动之前,可以基于页面卡顿检测需求预先注册相应的检测线程回调信息,并可将注册后的检测线程回调信息存储到框架配置文件中,以作为检测卡顿线程回调信息。
作为本发明的一个可选示例,在框架引擎FlutterEngine启动前,框架配置器可以在初始化的过程对检测线程回调信息进行注册,以将注册后的检测线程回调信息作为检测卡顿线程回调信息添加到框架配置文件中,以便后续框架引擎启动时可以依据该框架配置文件中的检测卡顿线程回调信息创建相应线程的检测任务。
步骤220,在引擎创建目标线程后,从预设的框架配置文件中获取所述目标线程对应的检测卡顿线程回调信息。
步骤230,基于所述目标线程对应的检测卡顿线程回调信息创建所述检测任务信息。
例如,结合上述示例,在目标线程包含UI线程和GPU线程的情况下,框架引擎FlutterEngine在创建壳CreateShell时,会创建UI线程和GPU线程,然后可从框架配置文件中获取诸如线程ID、线程类型和线程指针等检测卡顿线程回调信息去创建UI线程和GPU线程各自的框架线程检测实例BSFlutterThreadDetection,即创建UI线程的检测任务信息和GPU线程的检测任务信息,以便后续卡顿检测线程可以区分监控的是UI线程还是GPU线程。
步骤240,依据所述检测任务信息,创建所述目标线程对应的卡顿检测数据对象。
具体而言,本发明实施在创建出目标线程的检测任务信息后,可以将该将该检测任务信息传给卡顿检测线程,以通过顿检测线程创建出目标线程的对应的卡顿检测数据对象,从而使得卡顿检测线程可以通过读取该卡顿检测数据对象实现对目标线程的检测。
在实际处理中,引擎可以将目标线程的检测任务信息回调给框架配置器,以通过框架配置器将该目标线程的检测任务信息存储至框架配置文件中,使得卡顿检测线程可以从框架配置文件中获取到该目标线程的检测任务信息,进而可以使得卡顿检测线程可以依据目标线程的检测任务信息创建目标线程对应的卡顿检测数据对象。
当然,本实施例可以可以通过框架配置器直接将目标线程的检测任务信息转发给卡顿检测线程,使得卡顿检测线程检测任务信息创建目标线程对应的卡顿检测数据对象。可选的,本实施例将所述检测任务信息传输给卡顿检测线程,具体可以包括:在创建所述目标线程的检测任务信息之后,将所述检测任务信息发送给框架配置器;通过所述框架配置器将所述检测任务信息转发给所述卡顿检测线程。
例如,结合上述例子,框架引擎FlutterEngine在创建出GPU线程和UI线程的框架线程检测实例BSFlutterThreadDetection后,可以将GPU线程和UI线程的框架线程检测实例BSFlutterThreadDetection回调给框架配置器BSFlutterConfigure,即将框架线程检测实例BSFlutterThreadDetection作为检测任务信息回调给框架配置器BSFlutterConfigure。框架配置器BSFlutterConfigure在收到框架引擎FlutterEngine回调的框架线程检测实例BSFlutterThreadDetection后,可以可以将该框架线程检测实例BSFlutterThreadDetectionzu携带的线程ID、线程类型和一个能将卡顿检测方法运行到相应线程的回调函数Runner传给卡顿检测线程BSBlockDetection,即将目标线程的检测任务信息转发给卡顿检测线程BSBlockDetection,使得卡顿检测线程BSBlockDetection根据该检测任务信息创建出目标线程的对应的卡顿检测数据对象。具体的,卡顿检测线程BSBlockDetection在接收到检测任务信息后,可以针对UI线程和GPU线程创建相应的卡顿检测数据对象BlockDetectionThreadData,进而可以在检测任务超时时通过该卡顿检测数据对象BlockDetectionThreadData中的线程类型确定出是UI线程卡顿还是GPU线程卡顿。
步骤250,在所述卡顿检测数据对象被卡顿检测线程调用时,从所述卡顿检测数据对象中提取任务计数值。
步骤260,判断所述任务计数值是否大于预设卡顿阈值。
在实际处理中,卡顿检测线程可以按照预设时间间隔遍历其所需要读取的卡顿检测数据对象中的数据,以确定各个卡顿检测数据对象对应的线程是否发生卡顿。因此,本实施例在目标程序对应的卡顿检测数据对象被卡顿检测线程读取到时,从所述卡顿检测数据对象中提取任务计数值,以作为所述任务计数信息,然后可通过判断该任务计数值是否大于预设卡顿阈值来确定该任务计算信息是否满足预设卡顿检测条件。若提取到的任务计数值大于预设卡顿阈值,则可以跳转到步骤280执行,以确定任务计数信息满足预设卡顿检测条件;否则,可以确定该任务计数信息不满足预设卡顿检测条件,然后执行步骤270。
步骤270,若所述任务计数值不大于预设卡顿阈值,则依据预设单位变量值对所述任务计数值进行增加,并基于所述卡顿检测数据对象向所述目标线程发送线程释放任务。
其中,所述线程释放任务用于对所述任务计数值进行清除。
步骤280,若所述任务计数值大于预设卡顿阈值,则确定任务计数信息满足预设卡顿检测条件。
例如,在预设时间间隔为3秒的情况下,卡顿检测线程可以每隔3秒执行一次检测函数Fire,以通过该检测函数Fire遍历所有需要读取的卡顿检测数据对象BlockDetectionThreadData中的数据。由于卡顿检测数据对象BlockDetectionThreadData中设置有一个任务计数值Count,且卡顿检测线程每调用一次该任务计数值Count就自动按照预设单位变量值进行增加,如在卡顿检测线程每调用一次时任务计数值Count就自加1,同时可以向对应的目标线程发送一个任务计数值清零的任务flutterThreadReset。因此,在卡顿检测线程每次执行时,可以通过读取卡顿检测数据对象BlockDetectionThreadData中的任务计数值Count来确定该卡顿检测数据对象BlockDetectionThreadData对应的目标线程有没有执行到上一次的flutterThreadReset任务。
具体而言,如果卡顿检测线程执行时发现卡顿检测数据对象BlockDetectionThreadData中的任务计数值Count为零,则可以说明上一次的flutterThreadReset已经该卡顿检测数据对象对应的目标线程执行完,即可确定出该目标线程没有发生卡顿,然后该卡顿检测数据对象BlockDetectionThreadData中的任务计数值Count可以自动加1,同时可以向该卡顿检测数据对象BlockDetectionThreadData对应的目标线程发送一个任务计数值清零的任务flutterThreadReset,即发送线程释放任务。如果卡顿检测线程执行时发现某一卡顿检测数据对象BlockDetectionThreadData中的任务计数值Count不为零,则可以说明上一次的flutterThreadReset没有被该卡顿检测数据对象对应的目标线程执行到,从而可以在卡顿检测线程发现该卡顿检测数据对象的任务计数值Count大于预设卡顿阈值3时,即在卡顿检测线程发现该卡顿检测数据对象的任务计数大于3次时,确定该卡顿检测数据对象的任务计数信息满足预设卡顿检测条件,进而可以确定该卡顿检测数据对象对应的目标线程发生卡顿,然后执行步骤290。
步骤290,在所述任务计数信息满足预设卡顿检测条件时,生成所述目标线程对应的卡顿检测结果。
可选的,本实施例在所述任务计数信息满足预设卡顿检测条件时生成所述目标线程对应的卡顿检测结果,具体可以包括:在所述任务计数信息满足预设卡顿检测条件时,通过管理器获取卡顿线程堆栈信息;基于所述卡顿线程堆栈信息生成所述目标线程对应的卡顿检测结果。其中,卡顿线程堆栈信息可以是指在卡顿发生时应用程序中所有运行线程的堆栈信息。
具体而言,本发明实施例在确定出卡顿检测数据对象的任务计数信息满足预设卡顿检测条件时,可以通过管理器Manager的数据获取方法getData获取当前所有线程堆栈,即获取卡顿线程堆栈信息,以根据获取到的卡顿线程堆栈信息确定出该卡顿检测数据对象对应的目标线程发生卡顿原因,从而可以基于该目标线程的卡顿原因生成该目标线程对应的卡顿检测结果。
进一步的,本实施例基于所述卡顿线程堆栈信息生成所述目标线程对应的卡顿检测结果,可以包括:根据所述卡顿线程堆栈信息确定所述目标线程的卡顿原因;依据所述卡顿原因生成所述目标线程对应的卡顿检测结果。
例如,在确定出目标线程发生卡顿后,可以通过管理器Manager的数据获取方法getData获取当前所有线程堆栈,并可为各个线程堆栈添加自己的线程ID和线程类型,以作为卡顿线程堆栈信息,上传到后台服务器,使得后台服务器可以依据该卡顿线程堆栈信息分析出卡顿原因,进而可以基于卡顿原因生成该目标线程对应的卡顿检测结果。
综上,本发明实施例可以通过复用Native的卡顿检测线程和卡顿检测任务,在卡顿检测线程添加了对引擎的UI线程和GPU线程的检测,从而可以通过检测引擎的UI线程和GPU线程来实现Dart页面卡顿检测的目的,并且在Dart页面卡顿时能够区分是UI线程卡顿还是GPU线程卡顿,满足Dart页面检测需求。
需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明实施例并不受所描述的动作顺序的限制,因为依据本发明实施例,某些步骤可以采用其他顺序或者同时进行。
参照图3,示出了本发明实施例中的一种页面卡顿检测装置的结构方框示意图,该页面卡顿检测装置具体可以包括如下模块:
线程检测任务创建模块310,用于在引擎启动时,依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息;
线程数据对象创建模块320,用于依据所述检测任务信息,创建所述目标线程对应的卡顿检测数据对象;
任务计数信息获取模块330,用于在所述卡顿检测数据对象被卡顿检测线程调用时,获取所述卡顿检测数据对象的任务计数信息;
卡顿检测结果生成模块340,用于在所述任务计数信息满足预设卡顿检测条件时,生成所述目标线程对应的卡顿检测结果。
在上述实施例的基础上,可选的,上述页面卡顿检测装置还可以包括其他模块,如可以包括如下模块:
线程回调信息确定模块,用于确定检测线程回调信息,其中,所述检测线程回调信息包含线程类型、线程帐号和线程指针;
线程回调信息添加模块,用于将所述检测线程回调信息添加到框架配置文件中,以作为所述检测卡顿线程回调信息。
例如,线程回调信息确定模块可以在引擎启动前,确定检测线程回调信息,并可触发线程回调信息添加模块将确定的检测线程回调信息添加到框架配置文件中,以作为所述检测卡顿线程回调信息,从而实现了在引擎启动前预先在框架配置文件中注册检测卡顿线程回调信息。
在本发明的一个可选实施例中,所述线程检测任务创建模块310可以包括如下子模块:
线程回调信息获取子模块,用于在所述引擎创建目标线程后,从预设的框架配置文件中获取所述目标线程对应的检测卡顿线程回调信息;
检测任务信息创建子模块,用于基于所述目标线程对应的检测卡顿线程回调信息创建所述检测任务信息。
在本发明的一个可选实施例中,线程数据对象创建模块320可以包括如下子模块:
检测任务信息传输子模块,用于将所述检测任务信息传输给卡顿检测线程;
线程数据对象创建子模块,用于通过所述卡顿检测线程,创建所述目标线程的对应的卡顿检测数据对象。
本发明实施例中,可选的,所述检测任务信息传输子模块具体用于在检测任务信息创建子模块创建所述目标线程的检测任务信息之后,将所述检测任务信息发送给框架配置器;通过所述框架配置器将所述检测任务信息转发给所述卡顿检测线程。
在本发明的一个可选实施例中,任务计数信息获取模块330包括:任务计数值提取子模块。该任务计数值提取子模块可以用于从所述卡顿检测数据对象中提取任务计数值,以作为所述任务计数信息。
可选的,本发明实施例中的页面卡顿检测装置还可包括如下模块:
任务计数值判断模块,用于判断所述任务计数值是否大于预设卡顿阈值;
条件满足确定模块,用于在所述任务计数值大于预设卡顿阈值时,确定任务计数信息满足预设卡顿检测条件;
任务计数清除模块,用于在所述任务计数值不大于预设卡顿阈值时,依据预设单位变量值对所述任务计数值进行增加,并基于所述卡顿检测数据对象向所述目标线程发送线程释放任务。
其中,所述线程释放任务用于对所述任务计数值进行清除。
可选的,本实施例中的卡顿检测结果生成模块340可以包括如下子模块:
线程堆栈信息获取子模块,用于在所述任务计数信息满足预设卡顿检测条件时,通过管理器获取卡顿线程堆栈信息;
卡顿检测结果生成子模块,用于基于所述卡顿线程堆栈信息生成所述目标线程对应的卡顿检测结果。
在本发明的一个可选实施例中,卡顿检测结果生成子模块具体用于根据所述卡顿线程堆栈信息确定所述目标线程的卡顿原因,并依据所述卡顿原因生成所述目标线程对应的卡顿检测结果。
本实施例中,可选的,所述目标线程包含用户界面UI线程和图形处理器GPU线程,所述检测任务信息创建子模块可以包括如下单元:
UI线程检测任务创建子模块,用于采用所述UI线程对应的检测卡顿线程回调信息,创建所述UI线程的检测任务信息;
GPU线程检测任务创建子模块,用于采用所述GPU线程对应的检测卡顿线程回调信息,创建所述GPU线程的检测任务信息。
需要说明的是,上述提供的页面卡顿检测装置可执行本发明任意实施例所提供的页面卡顿检测方法,具备执行方法相应的功能和有益效果。
在具体实现中,上述页面卡顿检测装置可以集成在页面卡顿检测设备中。该页面卡顿检测设备可以是两个或多个物理实体构成,也可以是一个物理实体构成,如设备可以是个人计算机(Personal Computer,PC)、电脑、手机、平板设备、个人数字助理、服务器、消息收发设备、游戏控制台等。
进一步的,本发明实施例还提供一种页面卡顿检测设备,包括:处理器和存储器。存储器中存储有至少一条指令,且指令由所述处理器执行,使得所述检测设备执行如上述方法实施例中所述的页面卡顿检测方法。
本发明实施例还提供一种计算机可读存储介质,所述可读存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如上述方法实施例所述的页面卡顿检测方法。示例性的,该页面卡顿检测方法包括:在引擎启动时,依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息;依据所述检测任务信息,创建所述目标线程对应的卡顿检测数据对象;在所述卡顿检测数据对象被卡顿检测线程调用时,获取所述卡顿检测数据对象的任务计数信息;若所述任务计数信息满足预设卡顿检测条件,则生成所述目标线程对应的卡顿检测结果。
需要说明的是,对于装置、设备、存储介质实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由权利要求范围决定。
Claims (12)
1.一种页面卡顿检测方法,其特征在于,包括:
在引擎启动时,依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息;
依据所述检测任务信息,创建所述目标线程对应的卡顿检测数据对象;
在所述卡顿检测数据对象被卡顿检测线程调用时,获取所述卡顿检测数据对象的任务计数信息;
若所述任务计数信息满足预设卡顿检测条件,则生成所述目标线程对应的卡顿检测结果;
所述获取所述卡顿检测数据对象的任务计数信息,包括:
从所述卡顿检测数据对象中提取任务计数值,以作为所述任务计数信息。
2.根据权利要求1所述的页面卡顿检测方法,其特征在于,在所述引擎启动之前,还包括:
确定检测线程回调信息,其中,所述检测线程回调信息包含线程类型、线程帐号和线程指针;
将所述检测线程回调信息添加到框架配置文件中,以作为所述检测卡顿线程回调信息。
3.根据权利要求1所述的页面卡顿检测方法,其特征在于,所述依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息,包括:
在所述引擎创建目标线程后,从预设的框架配置文件中获取所述目标线程对应的检测卡顿线程回调信息;
基于所述目标线程对应的检测卡顿线程回调信息创建所述检测任务信息。
4.根据权利要求3所述的页面卡顿检测方法,其特征在于,依据所述检测任务信息,创建所述目标线程的对应的卡顿检测数据对象,包括:
将所述检测任务信息传输给卡顿检测线程;
通过所述卡顿检测线程,创建所述目标线程的对应的卡顿检测数据对象。
5.根据权利要求4所述的页面卡顿检测方法,其特征在于,所述将所述检测任务信息传输给卡顿检测线程,包括:
在创建所述目标线程的检测任务信息之后,将所述检测任务信息发送给框架配置器;
通过所述框架配置器将所述检测任务信息转发给所述卡顿检测线程。
6.根据权利要求1所述的页面卡顿检测方法,其特征在于,所述从所述卡顿检测数据对象中提取任务计数值之后,还包括:
判断所述任务计数值是否大于预设卡顿阈值;
若所述任务计数值大于预设卡顿阈值,则确定任务计数信息满足预设卡顿检测条件;
若所述任务计数值不大于预设卡顿阈值,则依据预设单位变量值对所述任务计数值进行增加,并基于所述卡顿检测数据对象向所述目标线程发送线程释放任务,所述线程释放任务用于对所述任务计数值进行清除。
7.根据权利要求1至6任一所述的页面卡顿检测方法,其特征在于,所述若所述任务计数信息满足预设卡顿检测条件,则生成所述目标线程对应的卡顿检测结果,包括:
在所述任务计数信息满足预设卡顿检测条件时,通过管理器获取卡顿线程堆栈信息;
基于所述卡顿线程堆栈信息生成所述目标线程对应的卡顿检测结果。
8.根据权利要求7所述的页面卡顿检测方法,其特征在于,基于所述卡顿线程堆栈信息生成所述目标线程对应的卡顿检测结果,包括:
根据所述卡顿线程堆栈信息确定所述目标线程的卡顿原因;
依据所述卡顿原因生成所述目标线程对应的卡顿检测结果。
9.根据权利要求3至5任一所述的页面卡顿检测方法,其特征在于,所述目标线程包含用户界面UI线程和图形处理器GPU线程,所述基于所述目标线程对应的检测卡顿线程回调信息创建所述检测任务信息,包括:
采用所述UI线程对应的检测卡顿线程回调信息,创建所述UI线程的检测任务信息;
采用所述GPU线程对应的检测卡顿线程回调信息,创建所述GPU线程的检测任务信息。
10.一种页面卡顿检测装置,其特征在于,包括:
线程检测任务创建模块,用于在引擎启动时,依据框架配置文件中的检测卡顿线程回调信息,创建目标线程的检测任务信息;
线程数据对象创建模块,用于依据所述检测任务信息,创建所述目标线程对应的卡顿检测数据对象;
任务计数信息获取模块,用于在所述卡顿检测数据对象被卡顿检测线程调用时,获取所述卡顿检测数据对象的任务计数信息;
卡顿检测结果生成模块,用于在所述任务计数信息满足预设卡顿检测条件时,生成所述目标线程对应的卡顿检测结果;
所述任务计数信息获取模块包括:任务计数值提取子模块;
所述任务计数值提取子模块用于从所述卡顿检测数据对象中提取任务计数值,以作为所述任务计数信息。
11.一种页面卡顿检测设备,其特征在于,包括:处理器和存储器;
所述存储器中存储有至少一条指令,所述指令由所述处理器执行,使得所述检测设备执行如权利要求1至9任一所述的页面卡顿检测方法。
12.一种计算机可读存储介质,其特征在于,所述可读存储介质中的指令由设备的处理器执行时,使得设备能够执行如权利要求1至9任一所述的页面卡顿检测方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011204136.6A CN112527627B (zh) | 2020-11-02 | 2020-11-02 | 一种页面卡顿检测方法、装置、设备及介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011204136.6A CN112527627B (zh) | 2020-11-02 | 2020-11-02 | 一种页面卡顿检测方法、装置、设备及介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112527627A CN112527627A (zh) | 2021-03-19 |
CN112527627B true CN112527627B (zh) | 2024-05-10 |
Family
ID=74979405
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011204136.6A Active CN112527627B (zh) | 2020-11-02 | 2020-11-02 | 一种页面卡顿检测方法、装置、设备及介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112527627B (zh) |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105094972A (zh) * | 2015-07-28 | 2015-11-25 | 百度在线网络技术(北京)有限公司 | 数据库操作任务的处理方法和装置 |
CN108512695A (zh) * | 2018-03-12 | 2018-09-07 | 腾讯音乐娱乐科技(深圳)有限公司 | 监控应用卡顿的方法及装置 |
CN108519923A (zh) * | 2018-03-01 | 2018-09-11 | 北京三快在线科技有限公司 | 一种卡顿检测方法及装置和电子设备 |
CN109446094A (zh) * | 2018-11-05 | 2019-03-08 | 网易(杭州)网络有限公司 | 一种卡顿检测方法、装置、电子设备和存储介质 |
CN110300328A (zh) * | 2018-03-21 | 2019-10-01 | 腾讯科技(深圳)有限公司 | 一种视频播放控制方法、装置及可读存储介质 |
CN110865940A (zh) * | 2019-11-11 | 2020-03-06 | 腾讯科技(深圳)有限公司 | 一种程序卡顿定位的方法以及相关装置 |
CN111625456A (zh) * | 2020-05-26 | 2020-09-04 | 北京达佳互联信息技术有限公司 | 一种卡顿定位方法和装置 |
CN111639004A (zh) * | 2020-05-12 | 2020-09-08 | 腾讯音乐娱乐科技(深圳)有限公司 | 用户界面卡顿监控方法、装置及存储介质 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8166464B2 (en) * | 2008-06-27 | 2012-04-24 | Microsoft Corporation | Analysis and detection of soft hang responsiveness program errors |
-
2020
- 2020-11-02 CN CN202011204136.6A patent/CN112527627B/zh active Active
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105094972A (zh) * | 2015-07-28 | 2015-11-25 | 百度在线网络技术(北京)有限公司 | 数据库操作任务的处理方法和装置 |
CN108519923A (zh) * | 2018-03-01 | 2018-09-11 | 北京三快在线科技有限公司 | 一种卡顿检测方法及装置和电子设备 |
CN108512695A (zh) * | 2018-03-12 | 2018-09-07 | 腾讯音乐娱乐科技(深圳)有限公司 | 监控应用卡顿的方法及装置 |
CN110300328A (zh) * | 2018-03-21 | 2019-10-01 | 腾讯科技(深圳)有限公司 | 一种视频播放控制方法、装置及可读存储介质 |
CN109446094A (zh) * | 2018-11-05 | 2019-03-08 | 网易(杭州)网络有限公司 | 一种卡顿检测方法、装置、电子设备和存储介质 |
CN110865940A (zh) * | 2019-11-11 | 2020-03-06 | 腾讯科技(深圳)有限公司 | 一种程序卡顿定位的方法以及相关装置 |
CN111639004A (zh) * | 2020-05-12 | 2020-09-08 | 腾讯音乐娱乐科技(深圳)有限公司 | 用户界面卡顿监控方法、装置及存储介质 |
CN111625456A (zh) * | 2020-05-26 | 2020-09-04 | 北京达佳互联信息技术有限公司 | 一种卡顿定位方法和装置 |
Non-Patent Citations (5)
Title |
---|
Android APP卡顿的关键原因及解决措施研究;贾红健;《电脑编程技巧与维护》;20180331(第03期);56-57+71 * |
Mining test repositories for automatic detection of UI performance regressions in Android apps;María Gómez等;《2016 IEEE/ACM 13th Working Conference on Mining Software Repositories》;20160614;13 -24 * |
基于GPU加速的医学图像显示及处理系统;胡杨升;《中国优秀硕士学位论文全文数据库(信息科技辑)》;20190115(第01期);I138-4062 * |
基于iOS的性能监测以及Crash防护系统的研究与实现;陈龙;《中国优秀硕士学位论文全文数据 库(信息科技辑)》;20180815(第08期);I138-143 * |
嵌入式浏览器渲染架构的研究与设计;唐成戬;《中国优秀硕士学位论文全文数据库(信息科技辑)》;20140115(第01期);I139-192 * |
Also Published As
Publication number | Publication date |
---|---|
CN112527627A (zh) | 2021-03-19 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10554805B2 (en) | Information processing method, terminal, and computer-readable storage medium | |
CN104268055B (zh) | 一种程序异常的监控方法和装置 | |
US11119887B2 (en) | Attaching metadata to lines of code for alerting to changes in the code | |
CN109446832B (zh) | 一种截屏方法及装置 | |
CN111209166B (zh) | 一种面向b/s架构业务系统的自动巡检系统 | |
US8671389B1 (en) | Web application resource manager on the web and localizable components | |
CN112068936A (zh) | 一种工作流管理平台及工作流管理系统 | |
KR20140126702A (ko) | 관련 문서들에 대한 확장 활성화 기법 | |
CN107526623B (zh) | 一种数据处理方法及装置 | |
CN111580926A (zh) | 模型发布方法、模型部署方法、装置、设备及存储介质 | |
CN111124371A (zh) | 一种基于游戏的数据处理方法、装置、设备及存储介质 | |
CN110888628B (zh) | 生成控制工具的方法、装置、设备和存储介质 | |
CN112506854A (zh) | 页面模板文件的存储和页面生成方法、装置、设备及介质 | |
CN116820635A (zh) | 一种文档块分享方法、装置、系统及存储介质 | |
US20170017483A1 (en) | Automatic import of third party analytics | |
CN112527627B (zh) | 一种页面卡顿检测方法、装置、设备及介质 | |
US20060271771A1 (en) | Exception tagging | |
CN112632547A (zh) | 一种数据处理方法和相关装置 | |
CN111581518A (zh) | 信息推送方法和装置 | |
US20180373512A1 (en) | Method and device for simulating synchronous blocking in asynchronous environment, storage medium, server and terminal | |
US7644316B2 (en) | System, method and program for managing browser scripts sent from server to client | |
EP4221241A1 (en) | Video editing method and apparatus, electronic device, and medium | |
CN113434217B (zh) | 漏洞扫描方法、装置、计算机设备及介质 | |
CN113590564B (zh) | 数据存储方法、装置、电子设备及存储介质 | |
CN113961835A (zh) | 数据处理方法、装置、电子设备及存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |