CN104035815B - 一种窗口防假死方法和装置 - Google Patents
一种窗口防假死方法和装置 Download PDFInfo
- Publication number
- CN104035815B CN104035815B CN201410212088.3A CN201410212088A CN104035815B CN 104035815 B CN104035815 B CN 104035815B CN 201410212088 A CN201410212088 A CN 201410212088A CN 104035815 B CN104035815 B CN 104035815B
- Authority
- CN
- China
- Prior art keywords
- window
- subwindow
- thread
- seemingly
- dead
- 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.)
- Expired - Fee Related
Links
Landscapes
- User Interface Of Digital Computer (AREA)
Abstract
本申请提供了一种窗口防假死方法和装置,涉及计算机技术领域。所述方法包括:在通过一线程创建子窗口时,先在与窗口系统各子窗口所在线程不同的线程中创建中间窗口,框架父窗口所述中间窗口为当前创建子窗口的父窗口,所述中间窗口的父窗口为框架父窗口;所述当前创建的子窗口所在线程与框架父窗口所在线程不同;如果一子窗口假死,则将假死子窗口的假死消息发送给相应中间窗口所在线程;通过所述中间窗口所在线程将中间窗口和所述假死子窗口从窗口框架中分离。通过本申请可以从窗口系统中将对应该假死子窗口的中间窗口剥离,避免由于子窗口假死导致整个窗口系统的假死状态,解决了Windows的窗口系统中由于子窗口假死从而导致整个窗口假死的问题。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种窗口防假死方法和装置。
背景技术
Windows客户端软件是基于窗口结构设计的。窗口之间有父子关系、兄弟关系等,windows操作系统会根据这些关系来管理窗口的显示、焦点、窗口大小等,这大大减轻了windows开发人员的工作。例如:如果隐藏父窗口,那么所有父窗口的子窗口也会一起隐藏,并且失去焦点,这些都是操作系统帮助实现的。
这种设计也会有一些副作用,最严重的问题之一就是子窗口卡住后,会导致父窗口也会卡住。例如:子窗口在某个消息处理中发生假死、死循环等,此时再去操作父窗口,如改变父窗口大小、显示、隐藏父窗口、设置父窗口属性等,父窗口也会假死,导致整个窗口系统假死,那么如果想要打开新的窗口,只能重启窗口,给用户带来极大不便。其中,所述假死是窗口系统的的一种出问题的状态,表现为界面不刷新,点击任何按钮没有响应,无法进行任何一种操作的状态。
比如,在多标签浏览器中,浏览器框架父窗口和浏览器子窗口,都是在同一个线程中的,当浏览器子窗口出现问题后,会直接导致整个父窗口假死、甚至崩溃,即导致整个浏览器处于假死状态。
现有技术中,通过将父窗口、子窗口放在不同的进程或者线程,该方法可以部分解决子窗口假死,框架父窗口也假死的问题。当子窗口假死后,其所在的线程不能处理任何消息,此时框架父窗口所在的线程如果不向该子窗口发送同步消息,则父窗口仍然可以相应用户的操作。对于该方案来说,由于windows操作系统对于具有父子关系、兄弟关系的窗口会做很多逻辑处理,例如,隐藏父窗口时,会隐藏所有该父窗口的子窗口等,那么一旦某个子窗口假死,如果隐藏父窗口,那么父窗口还会向假死的子窗口发送同步消息,那么由于子窗口假死,父窗口也会接着假死,从而导致整个窗口系统假死,即使整个窗口系统处于假死状态。比如,若浏览器当前标签的子窗口假死后,隐藏浏览器框架父窗口时,就会向假死的子窗口发送同步消息,从而导致整个浏览器假死。
发明内容
本申请所要解决的技术问题是提供一种窗口防假死方法和装置,在Windows系统中从根本上解决了窗口系统的子窗口假死从而导致整个窗口系统假死的问题。
为了解决上述问题,本申请公开了一种窗口防假死方法,包括:
在通过一线程创建子窗口时,先在与窗口系统各子窗口所在线程不同的线程中创建中间窗口;框架父窗口所述中间窗口为当前创建子窗口的父窗口,所述中间窗口的父窗口为框架父窗口;所述当前创建的子窗口所在线程与框架父窗口所在线程不同;
检测各子窗口是否假死,如果一子窗口假死,则将假死子窗口的假死消息发送给相应中间窗口所在的线程;
通过所述中间窗口所在线程将中间窗口和所述假死子窗口从窗口框架中分离。
优选的,所述的分离包括:
分离中间窗口与框架父窗口的父子关系,和中间窗口对应的子窗口的线程输入消息循环与中间窗口对应的框架父窗口的线程输入消息循环的连接关系。
优选的,通过以下步骤进行分离:
将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;
将所述子窗口对应的中间窗口的父窗口设置为空;
将所述子窗口对应的中间窗口本身设置为不是孩子窗口的属性。
优选的,通过以下步骤检测各子窗口是否假死:
在框架父窗口启动后,启动假死窗口检测线程;
当所述子窗口创建时,将所述子窗口的窗口句柄存入假死窗口检测线程的队列中;
检测各子窗口的窗口句柄对应的时间戳,所述窗口句柄对应的时间戳由相应子窗口所在线程更新;如果一窗口句柄对应的时间戳未更新时间段超过阈值,则确认相应子窗口假死。
优选的,在将中间窗口和所述子窗口从窗口框架中分离后还包括:
当所述子窗口恢复正常后,恢复所述中间窗口与所述子窗口的父子关系,和恢复所述框架父窗口与所述中间窗口的父子关系。
优选的,通过以下步骤恢复所述中间窗口与所述子窗口的父子关系,并恢复所述框架父窗口与所述中间窗口的父子关系:
将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接;
将所述子窗口对应的中间窗口的属性设置为具有孩子窗口属性;
将假死子窗口对应的中间窗口的父窗口设置为框架父窗口。
优选的,通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
优选的,对于所述子窗口所在线程创建弹出窗口时,查询当前弹出窗口是否在弹出窗口列表中存在;
如果存在,调整当前弹出窗口的属性为只依赖所述子窗口所在线程。
优选的,当所述子窗口退出时,剥离所述中间窗口与所述子窗口与的父子关系,和剥离所述框架父窗口与所述中间窗口的父子关系;
销毁所述子窗口和中间窗口。
优选的,所述的框架父窗口为浏览器框架父窗口,所述子窗口为浏览器标签页。
相应的,本申请还公开了一种窗口防假死装置,包括:
中间窗口创建模块,在与子窗口所在线程不同的线程中创建中间窗口;框架父窗口所述中间窗口为所述子窗口的父窗口,所述中间窗口的父窗口为框架父窗口,所述子窗口所在线程与框架父窗口所在线程不同;
假死窗口检测模块,用于检测各子窗口是否假死,如果所述子窗口假死,则将假死子窗口的假死消息发送给相应中间窗口所在的线程;
分离模块,用于通过所述中间窗口所在线程将中间窗口和所述假死子窗口从窗口框架中分离。
优选的,所述的分离包括:
分离中间窗口与框架父窗口的父子关系,和中间窗口对应的子窗口的线程输入消息循环与中间窗口对应的框架父窗口的线程输入消息循环的连接关系。
优选的,所述分离模块包括:
消息循环剥离单元,用于将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;
第一属性设置单元,用于将所述子窗口对应的中间窗口的父窗口设置为空;
第二属性设置单元,用于将所述子窗口对应的中间窗口本身设置为不是孩子窗口的属性。
优选的,所述假死窗口检测模块包括:
假死窗口检测线程启动单元,在框架父窗口启动后,启动假死窗口检测线程;
窗口句柄存入单元,当所述子窗口创建时,将所述子窗口的窗口句柄存入假死窗口检测线程的队列中;
假死判断单元,检测各子窗口的窗口句柄对应的时间戳,所述时间戳由所述子窗口所在线程更新;如果一窗口句柄对应的时间戳未更新时间段超过阈值,则确认相应子窗口假死。
优选的,还包括:
假死子窗口恢复模块,用于当所述子窗口恢复正常后,恢复所述中间窗口与所述子窗口的父子关系,和恢复所述框架父窗口与所述中间窗口的父子关系。
优选的,所述假死子窗口恢复模块包括:
消息循环连接单元,用于将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接;
第三属性设置单元,将所述子窗口对应的中间窗口的属性设置为具有孩子窗口属性;
第四属性设置单元,将假死子窗口对应的中间窗口的父窗口设置为框架父窗口。
优选的,通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
优选的,还包括:
弹出窗口处理单元,用于对于所述子窗口所在线程创建弹出窗口时,查询当前弹出窗口是否在弹出窗口列表中存在;如果存在,调整当前弹出窗口的属性为只依赖所述子窗口所在线程。
优选的,还包括:
窗口销毁单元,用于当所述子窗口退出时,剥离所述中间窗口与所述子窗口与的父子关系,和剥离所述框架父窗口与所述中间窗口的父子关系。
优选的,所述的框架父窗口为浏览器框架父窗口,所述子窗口为浏览器标签页。
与现有技术相比,本申请包括以下优点:
本申请通过在与子窗口所在线程不同的线程中创建中间窗口,所述中间窗口作为该子窗口的父窗口,并且所述中间窗口的父窗口设置为框架父窗口;如此当所述子窗口假死时,可以从窗口系统中将对应该假死子窗口的中间窗口剥离,从而达到剥离假死子窗口的作用,避免了由于子窗口假死导致整个窗口系统的假死状态。
附图说明
图1是本申请一种窗口防假死方法的流程示意图;
图2是本申请优选的一种窗口防假死方法的流程示意图;
图3是本申请一种窗口防假死装置的结构示意图;
图4是本申请优选的一种窗口防假死装置的结构示意图。
具体实施方式
为使本申请的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本申请作进一步详细的说明。
在Windows系统下,所有的窗口(即有可显示给用户且可操作的窗口)的程序都是消息驱动的,也就是用户操作鼠标和键盘会产生各种消息,这些消息会分发到当前系统有焦点的窗口(一个系统中同一时刻仅有一个窗口有焦点),当前焦点的窗口收到消息以后,会根据消息的不同类型做出不同的响应。比如鼠标按下,键盘按键等都会产生消息。根据这些消息,使应用程序不断做出响应,刷新界面,完成操作。
系统内部的消息处理方式为:系统会把消息不断防盗消息队列里面,每个有窗口的执行线程都有一个消息循环,这个消息循环不断的从消息队列里面获取消息,处理消息。但是如果处理消息部分发生了阻塞,一直没有运行完成,那么这个消息循环就不能获取新的消息,这时再对这个界面进行操作就不会响应了,也就是出现假死。
Windows客户端软件是基于窗口结构设计的,也即在Windows系统下,窗口之间是有父子关系、兄弟关系等关系的。父子窗口之间的父子关系为:当父窗口移动的时候,子窗口也必须移动;当父窗口隐藏时,子窗口也必须隐藏等。在多线程Windows环境,即父子窗口在不同的线程中时,由于windows系统是基于父子关系管理父子窗口的,子窗口的所在线程的消息循环是在父窗口所在线程的消息循环中的;如果子窗口假死,即子窗口所在线程阻塞,那么如果父窗口进行隐藏等动作时,父窗口所在线程再根据父子关系向子窗口所在线程发送消息进行处理时,由于子窗口所在线程阻塞,那么子窗口所在进程就无法处理,从而无法发送处理后的响应信息给父窗口所在线程,这就导致父窗口所在进程也阻塞,从而整个窗口系统假死。而本申请就是基于Windows系统窗口的实际运行原理,在子窗口假死时,将子窗口从窗口系统中剥离出去,即剥离假死子窗口与框架父窗口的关系,这样子窗口与父窗口的消息不相互依赖,即可防止整个窗口系统假死。
参照图1,示出了本申请一种窗口防假死方法的流程示意图,包括:
步骤110,在通过一线程创建子窗口时,先在与窗口系统各子窗口所在线程不同的线程中创建中间窗口;框架父窗口所述中间窗口为当前创建子窗口的父窗口,所述中间窗口的父窗口为框架父窗口;所述当前创建的子窗口所在线程与框架父窗口所在线程不同。
对于一个窗口系统,在窗口系统启动后,其可能存在多个进程,每个进程中又存在多个线程管理窗口系统的框架父窗口和各子窗口。在窗口系统启动后,对于在该窗口系统中由线程B创建的子窗口,在该窗口系统的不同于创建各子窗口的线程中创建一个中间窗口,该中间窗口为所述在线程B中创建的子窗口的父窗口,并且该中间窗口为框架父窗口的子窗口。其中,所述子窗口所在线程与框架窗口所在线程也不相同。
比如,对于一个浏览器,当浏览器框架启动后,浏览器框架父窗口由该浏览器的进程PA的线程TA创建,在创建浏览器子窗口时,比如由进程PA的线程TB创建子窗口W1时,首先由与线程TB不同的一个线程比如TA创建一个中间窗口M1,该中间窗口M1设置为子窗口W1的父窗口,同时设置该中间窗口的父窗口为框架父窗口。其中也可由线程TC创建中间窗口,但线程TC没有创建管理任何其他子窗口,如果TC创建了子窗口W2,那么对于前述子窗口W1,就不能用TC创建子窗口W1的中间窗口。
其中,在设置窗口父子关系一般有两个方法:
1:Createwindow
2:创建时不设置父窗口,创建完后再设置父窗口。
SetParent(hwnd,hParent);
对于每一个浏览器的子窗口,均由与子窗口所在线程不同的线程创建一个中间窗口进行上述相同的设置。比如,对于子窗口W2,其所在线程为TC,也可采用线程TA创建一个中间窗口M2,该中间窗口M2设置为子窗口W2的父窗口,同时设置该中间窗口的父窗口为框架父窗口。
在本申请中,只要保证子窗口所在线程与中间窗口线程和框架父窗口线程均不相同即可,而对于中间窗口所在线程与框架父窗口所在线程是否相同本申请不加以限制。比如上述例子中,框架父窗口的线程为TA,子窗口的线程为TB,中间窗口的线程为TA,其中中间窗口也可采用其他没创建子窗口的线程进行创建等。
另外,本申请对于子窗口,相应的中间窗口和框架父窗口所在的进程不加以限制。在实际中,一个窗口框架可能包括多个进程,比如一个浏览器框架包括进程PA和进程PA,对于子窗口W1所在的进程可以为进程PA也可以为进程PB,对于该子窗口的中间窗口M1所在的进程也可以为进程PA也可以为进程PB,对于框架父窗口所在的进程也可以为进程PA也可以为进程PB。
步骤120,检测各子窗口是否假死,如果所述子窗口假死,则将假死子窗口的假死消息发送给相应中间窗口所在的线程。
在通过前述步骤建立子窗口后,可建立一个假死窗口检测线程,检测各子窗口是否假死,如果某个子窗口假死,则将该假死子窗口的消息发送到该假死子窗口的中间窗口所在的进程。
优选的,通过以下步骤检测各子窗口是否假死:
步骤S11,在框架父窗口启动后,启动假死窗口检测线程。
比如,对于浏览器来说,预先设置一个假死窗口检测线程,在浏览器启动后,更进一步的说,在浏览器的框架父窗口启动后,启动所述假死窗口检测线程。
步骤S12,当所述子窗口创建时,将所述子窗口的窗口句柄存入假死窗口检测线程的队列中。
当通过前述步骤创建子窗口时,将该子窗口的窗口句柄存入假死窗口检测线程的队列中。所述的窗口句柄为句柄是个32位的数,而不是指针,窗口句柄是窗口的身份标志,调用API函数的时候,通过窗口句柄来判断是哪个窗体使用了函数。一般的窗口句柄类型是HWND,还有实例句柄HINSTANCE、设备描述表句柄HDC等。其中,可通过如下方式获取子窗口的句柄:
1:创建时记录下来:例如HWND hWnd=CreateWindow(...)
2:根据窗口间的关系来获取窗口句柄:
例如:获取窗口的父窗口,GetParent
获取所有子窗口,EnumThreadWindow
3:根据窗口的进程空间来获取窗口:
EnumThreadWindow等。
4:根据窗口的某个特征来查找窗孔:
FindWindow
在实际中,获取句柄的方式除了以上4中,还包括其他方式,本申请不对其加以限制。
然后将所述窗口句柄存入假死窗口检测线程的队列中。
步骤S13,检测各子窗口的窗口句柄对应的时间戳,所述时间戳由所述子窗口所在线程更新;如果一窗口句柄对应的时间戳未更新时间段超过阈值,则确认相应子窗口假死。
在一子窗口所在的线程输入消息循环中,每次收到消息时,表示该线程处于活着的状态,则由该线程更新所述子窗口对应的时间戳。
实际中,假死窗口检测线程每隔一段时间检测队列中的各子窗口的窗口句柄对应的时间戳,当一窗口句柄对应的时间戳未更新时间段超过阈值,则确认窗口句柄对应的子窗口假死。比如子窗口W1的窗口句柄对应的时间戳为2011年12月24日21时50分29秒,如果假死窗口检测线程为每1秒检测一次,如果10秒后,窗口W1的窗口句柄对应的时间戳仍为2011年12月24日21时50分29秒,那么窗口W1未更新时间段为10秒;如果设置未更新时间段的阈值为8秒,那么窗口W1的未更新时间段超过阈值,即可确认窗口W1假死。
然后,将该假死子窗口的消息发送到该假死子窗口的中间窗口所在的进程。
步骤130,通过所述中间窗口所在线程将中间窗口和所述假死子窗口从窗口框架中分离。
所述的分离包括:分离中间窗口与框架父窗口的父子关系,和中间窗口对应的子窗口的线程输入消息循环与中间窗口对应的框架父窗口的线程输入消息循环的连接关系。
优选的,通过以下步骤进行分离:
步骤S21,将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离。
优选的,通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离。
在实际中API函数AttachThreadInput包括表一中的参数:
参数 | 说明 |
idAttach | 欲连接线程的标识符(ID) |
idAttachTo | 与idAttach线程连接的另一个线程的标识符 |
fAttach | TRUE(非零)连接,FALSE(0)撤消连接 |
表一
通过参数fAttach将子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离,即使fAttach变为FALSE(0)撤消连接。
步骤S22,将所述子窗口对应的中间窗口的父窗口设置为空。
比如,通过“SetParent(m_hWnd,NULL);”语句进行设置。
步骤S23,将所述子窗口对应的中间窗口本身设置为不是孩子窗口的属性。比如,通过“SetWindowLong(m_hWnd,GWL_STYLE,WS_POPUP|WS_CLIPSIBLINGS);”进行设置。
即通过步骤S22和步骤S23,将假死子窗口对应的中间窗口的属性设置为自己没有父窗口,并且自己也不为谁的孩子窗口,如此,根据Windows系统的逻辑,Windows系统即可对中间窗口进行管理。
通过上述步骤,即可将假死子窗口对应的中间窗口与框架父窗口的父子关系分离了,假死子窗口阻塞的线程就不会影响框架父窗口的线程,也即窗口系统不会进入假死状态。
另外,在实际中,假死的子窗口也可能由于线程的阻塞解除,恢复正常的运行状态,那么子窗口也恢复正常。那么对于这种情况,优选的,还包括:
步骤140,当所述子窗口恢复正常后,恢复所述中间窗口与所述子窗口的父子关系,和恢复所述框架父窗口与所述中间窗口的父子关系。
优选的,通过以下步骤恢复所述中间窗口与所述子窗口的父子关系,并恢复所述框架父窗口与所述中间窗口的父子关系:
步骤S31,将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
优选的,通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
在实际通过上述表一参数fAttach将子窗口的线程输入消息循环和框架父窗口的线程输入消息循环链接,即使fAttach变为TRUE(非零)连接。
步骤S32,将所述子窗口对应的中间窗口的属性设置为具有孩子窗口属性。
步骤S33,将假死子窗口对应的中间窗口的父窗口设置为框架父窗口。
如此,假死的子窗口与相应的中间窗口恢复了父子关系,所述中间窗口也于框架父窗口恢复了父子关系,那么子窗口又可根据Windows系统的逻辑正常运行。并且可以使得窗口系统对于用户来说更为流畅。
另外,在实际中,子窗口所在线程可能会创建一些弹出窗口(popup窗口),那么对于这些窗口,一般需要将其对于框架父窗口所在线程的依赖性去掉,让其只依赖于生产该窗口的线程。优选的,通过以下步骤进行:
S41,对于所述子窗口所在线程创建弹出窗口时,查询当前弹出窗口是否在弹出窗口列表中存在。
在实际中,比如对于输入法弹出窗口,其既依赖于生产该弹出窗口的子窗口所在线程,也依赖于框架父窗口所在的线程,那么需要将这类弹出窗口的线程依赖关系改为只依赖相应子窗口的线程。
实际中,一般通过预先测试确认哪些弹出窗口能影响假死窗口的分离,然后将这些窗口存入弹出窗口列表中。
S42,如果存在,调整当前弹出窗口的属性为只依赖所述子窗口所在线程。
如果弹出窗口列表中存在能优选假死窗口分离的弹出窗口,则调整当前弹出窗口的属性为只依赖所述子窗口所在线程。
比如在创建该窗口时,设置该窗口的父窗口替换为NULL。
然后通过“SetParent(m_hWnd,NULL);”进行设置。
另外,如果子窗口退出,则剥离该子窗口对应的各种父子关系,然后再销毁窗口。
优选的,步骤S51,当所述子窗口退出时,剥离所述中间窗口与所述子窗口与的父子关系,和剥离所述框架父窗口与所述中间窗口的父子关系;
S52,销毁所述子窗口和中间窗口。
在本申请中所述的框架父窗口为浏览器框架父窗口,所述子窗口为浏览器标签页。
参照图2,其示出了本申请优选的一种窗口防假死方法的流程示意图。
步骤210,启动窗口系统。
比如启动浏览器框架,此时会启动假死窗口检测线程。
步骤220,创建子窗口,并在框架进程中创建该子窗口的中间窗口。
在通过一线程创建子窗口(比如浏览器的标签页)时,先在与窗口系统各子窗口所在线程不同的线程中创建中间窗口;框架父窗口所述中间窗口为当前创建子窗口的父窗口,所述中间窗口的父窗口为框架父窗口;所述当前创建的子窗口所在线程与框架父窗口所在线程不同。
步骤230,将各子窗口的窗口句柄存入窗口假死检测线程的队列中。
步骤240,判断子窗口是否假死,如果假死,则转入步骤250;否则,转入步骤280。
检测各子窗口的窗口句柄对应的时间戳,所述时间戳由所述子窗口所在线程更新;如果一窗口句柄对应的时间戳未更新时间段超过阈值,则确认相应子窗口假死。
在一子窗口所在的线程输入消息循环中,每次收到消息时,表示该线程处于活着的状态,则由该线程更新所述子窗口对应的时间戳。
实际中,假死窗口检测线程每隔一段时间检测队列中的各子窗口的窗口句柄对应的时间戳,当一窗口句柄对应的时间戳未更新时间段超过阈值,则确认窗口句柄对应的子窗口假死。比如子窗口W1的窗口句柄对应的时间戳为2011年12月24日21时50分29秒,当前检测时间为2011年12月24日21时51分00秒,那么当前检测时间到最近的线程处于活着状态的时间的时间段为31秒,如果设置阈值为30秒,那么所述时间段大于30秒,即可确认窗口W1已经假死。
然后,将该假死子窗口的消息发送到该假死子窗口的中间窗口所在的进程。
步骤250,分离假死子窗口。
优选的,通过以下步骤进行分离:
步骤S21,将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离。
优选的,通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离。
步骤S22,将所述子窗口对应的中间窗口的父窗口设置为空。
比如,通过“SetParent(m_hWnd,NULL);”语句进行设置。
步骤S23,将所述子窗口对应的中间窗口本身设置为不是孩子窗口的属性。比如,通过“SetWindowLong(m_hWnd,GWL_STYLE,WS_POPUP|WS_CLIPSIBLINGS);”进行设置。
通过上述步骤,即可将假死子窗口对应的中间窗口与框架父窗口的父子关系分离了,假死子窗口阻塞的线程就不会影响框架父窗口的线程,也即窗口系统不会进入假死状态。
步骤260,判断所述子窗口是否恢复正常;当子窗口恢复正常,则转入步骤270;否则,转入步骤280。
步骤270,将所述子窗口还原为窗口系统的子窗口。
当所述子窗口恢复正常后,恢复所述中间窗口与所述子窗口的父子关系,和恢复所述框架父窗口与所述中间窗口的父子关系。
优选的,通过以下步骤恢复所述中间窗口与所述子窗口的父子关系,并恢复所述框架父窗口与所述中间窗口的父子关系:
步骤S31,将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
优选的,通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
步骤S32,将所述子窗口对应的中间窗口的属性设置为具有孩子窗口属性。
步骤S33,将假死子窗口对应的中间窗口的父窗口设置为框架父窗口。
步骤280,结束窗口系统。
其中,在该过程中如果子窗口退出,则剥离该子窗口对应的各种父子关系,然后再销毁窗口。
优选的,步骤S51,当所述子窗口退出时,剥离所述中间窗口与所述子窗口与的父子关系,和剥离所述框架父窗口与所述中间窗口的父子关系;
S52,销毁所述子窗口和中间窗口。
参照图3,其示出了本申请一种窗口防假死装置,包括:
中间窗口创建模块310,在与子窗口所在线程不同的线程中创建中间窗口;框架父窗口所述中间窗口为所述子窗口的父窗口,所述中间窗口的父窗口为框架父窗口,所述子窗口所在线程与框架父窗口所在线程不同;
假死窗口检测模块320,用于检测各子窗口是否假死,如果所述子窗口假死,则将假死子窗口的假死消息发送给相应中间窗口所在的线程;
分离模块330,用于通过所述中间窗口所在线程将中间窗口和所述假死子窗口从窗口框架中分离。
其中,所述的分离包括:分离中间窗口与框架父窗口的父子关系,和中间窗口对应的子窗口的线程输入消息循环与中间窗口对应的框架父窗口的线程输入消息循环的连接关系。
其中,所述分离模块330包括:
消息循环剥离单元,用于将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;
第一属性设置单元,用于将所述子窗口对应的中间窗口的父窗口设置为空;
第二属性设置单元,用于将所述子窗口对应的中间窗口本身设置为不是孩子窗口的属性。
其中,所述假死窗口检测模块320包括:
假死窗口检测线程启动单元,在框架父窗口启动后,启动假死窗口检测线程;
窗口句柄存入单元,当所述子窗口创建时,将所述子窗口的窗口句柄存入假死窗口检测线程的队列中;
假死判断单元,检测各子窗口的窗口句柄对应的时间戳,所述时间戳由所述子窗口所在线程更新;如果一窗口句柄对应的时间戳未更新时间段超过阈值,则确认相应子窗口假死。
另外,参照图4,本申请还包括:
假死子窗口恢复模块340,用于当所述子窗口恢复正常后,恢复所述中间窗口与所述子窗口的父子关系,和恢复所述框架父窗口与所述中间窗口的父子关系。
其中,所述假死子窗口恢复模块包括:
消息循环连接单元,用于将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接;
第三属性设置单元,将所述子窗口对应的中间窗口的属性设置为具有孩子窗口属性;
第四属性设置单元,将假死子窗口对应的中间窗口的父窗口设置为框架父窗口。
其中,还包括:
弹出窗口处理单元,用于对于所述子窗口所在线程创建弹出窗口时,查询当前弹出窗口是否在弹出窗口列表中存在;如果存在,调整当前弹出窗口的属性为只依赖所述子窗口所在线程。
另外,还包括:
窗口销毁单元,用于当所述子窗口退出时,剥离所述中间窗口与所述子窗口与的父子关系,和剥离所述框架父窗口与所述中间窗口的父子关系。
在实际中,现有技术存在两种方案:
方案二,将子窗口中容易假死的逻辑放在一个后台进程中,后台进程绘制好窗口内容后,通过进程间通信将窗口内容传递给子窗口,子窗口只做就简单、最没有风险的事情,将窗口内容显示出来。对于本方案来说,只是把界面解析、渲染部分放在了后台进程中。但是导致假死的逻辑有很多,比如对于浏览器来说,可能安装了很多第三方插件,但是第三方插件很难放到后台窗口去,例如:flash播放插件。在实际中很难预先知道哪些逻辑容易导致子窗口假死,从而无法准确、完整的将容易假死的逻辑放在后台进程中。
方案三,该方案则是地将父子窗口破坏,将父子窗口都设置为顶层窗口,自己完全控制框架父窗口、框架父窗口来模拟出windows操作系统所维护的父子窗口的效果。比如,将浏览器窗口的父子窗口破坏,将父子窗口都设置为顶层窗口,自己完全控制框架父窗口,浏览器窗口来模拟出windows操作系统所维护的父子窗口的效果,该方案通过控制浏览器窗口的尺寸、Z-Order顺序、激活状态等来模拟父子窗口的效果。对于本方案来说,在界面未假死时,由于破坏了windows的父子窗口关系,带来了很多难以解决问题。例如窗口激活状态等、Z-Order问题等。当子窗口假死后,不能改变假死窗口的尺寸、显示状态,假死的窗口会固定显示在其假死时的状态,可能影响用户后续使用,比如,如果假死的窗口范围包括了Windows桌面的某个或某几个快捷方式,由于该种方式假死的窗口不能改变显示状态,比如窗口最小化,那么就会导致用户无法使用上述快捷方式;并且由于该方案是模拟父子窗口的效果,而windows系统管理各窗口时是根据实际存在的父子关系管理各个窗口,如此可能导致本来是父子关系的父窗口A和子窗口B之间可能插入了一个其他窗口C,破坏了真实父子窗口的显示关系。
对于本申请装置实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。
以上对本申请所提供的一种防假死方法和装置,进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
本发明实施例揭示了:A1、一种窗口防假死方法,其特征在于,包括:
在通过一线程创建子窗口时,先在与窗口系统各子窗口所在线程不同的线程中创建中间窗口;框架父窗口所述中间窗口为当前创建子窗口的父窗口,所述中间窗口的父窗口为框架父窗口;所述当前创建的子窗口所在线程与框架父窗口所在线程不同;
检测各子窗口是否假死,如果一子窗口假死,则将假死子窗口的假死消息发送给相应中间窗口所在的线程;
通过所述中间窗口所在线程将中间窗口和所述假死子窗口从窗口框架中分离。
A2、根据A1所述的方法,其特征在于,所述的分离包括:
分离中间窗口与框架父窗口的父子关系,和中间窗口对应的子窗口的线程输入消息循环与中间窗口对应的框架父窗口的线程输入消息循环的连接关系。
A3、根据A1或A2所述的方法,其特征在于,通过以下步骤进行分离:
将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;
将所述子窗口对应的中间窗口的父窗口设置为空;
将所述子窗口对应的中间窗口本身设置为不是孩子窗口的属性。
A4、根据A1所述的方法,其特征在于,通过以下步骤检测各子窗口是否假死:
在框架父窗口启动后,启动假死窗口检测线程;
当所述子窗口创建时,将所述子窗口的窗口句柄存入假死窗口检测线程的队列中;
检测各子窗口的窗口句柄对应的时间戳,所述窗口句柄对应的时间戳由相应子窗口所在线程更新;如果一窗口句柄对应的时间戳未更新时间段超过阈值,则确认相应子窗口假死。
A5、根据A1所述的方法,其特征在于,在将中间窗口和所述子窗口从窗口框架中分离后还包括:
当所述子窗口恢复正常后,恢复所述中间窗口与所述子窗口的父子关系,和恢复所述框架父窗口与所述中间窗口的父子关系。
A6、根据A5所述的方法,其特征在于,通过以下步骤恢复所述中间窗口与所述子窗口的父子关系,并恢复所述框架父窗口与所述中间窗口的父子关系:
将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接;
将所述子窗口对应的中间窗口的属性设置为具有孩子窗口属性;
将假死子窗口对应的中间窗口的父窗口设置为框架父窗口。
A7、根据A3所述的方法,其特征在于:
通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
A8、根据A6所述的方法,其特征在于:
通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
A9、根据A1所述的方法,其特征在于:
对于所述子窗口所在线程创建弹出窗口时,查询当前弹出窗口是否在弹出窗口列表中存在;
如果存在,调整当前弹出窗口的属性为只依赖所述子窗口所在线程。
A10、根据A1所述的方法,其特征在于:
当所述子窗口退出时,剥离所述中间窗口与所述子窗口与的父子关系,和剥离所述框架父窗口与所述中间窗口的父子关系;
销毁所述子窗口和中间窗口。
A11、根据A1所述的方法,其特征在于:
所述的框架父窗口为浏览器框架父窗口,所述子窗口为浏览器标签页。
本发明实施例还揭示了B12、一种窗口防假死装置,其特征在于,包括:
中间窗口创建模块,在与子窗口所在线程不同的线程中创建中间窗口;框架父窗口所述中间窗口为所述子窗口的父窗口,所述中间窗口的父窗口为框架父窗口,所述子窗口所在线程与框架父窗口所在线程不同;
假死窗口检测模块,用于检测各子窗口是否假死,如果所述子窗口假死,则将假死子窗口的假死消息发送给相应中间窗口所在的线程;
分离模块,用于通过所述中间窗口所在线程将中间窗口和所述假死子窗口从窗口框架中分离。
B13、根据B12所述的装置,其特征在于,所述的分离包括:
分离中间窗口与框架父窗口的父子关系,和中间窗口对应的子窗口的线程输入消息循环与中间窗口对应的框架父窗口的线程输入消息循环的连接关系。
B14、根据B12或B13所述的装置,其特征在于,所述分离模块包括:
消息循环剥离单元,用于将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;
第一属性设置单元,用于将所述子窗口对应的中间窗口的父窗口设置为空;
第二属性设置单元,用于将所述子窗口对应的中间窗口本身设置为不是孩子窗口的属性。
B15、根据B12所述的装置,其特征在于,所述假死窗口检测模块包括:
假死窗口检测线程启动单元,在框架父窗口启动后,启动假死窗口检测线程;
窗口句柄存入单元,当所述子窗口创建时,将所述子窗口的窗口句柄存入假死窗口检测线程的队列中;
假死判断单元,检测各子窗口的窗口句柄对应的时间戳,所述时间戳由所述子窗口所在线程更新;如果一窗口句柄对应的时间戳未更新时间段超过阈值,则确认相应子窗口假死。
B16、根据B12所述的装置,其特征在于,还包括:
假死子窗口恢复模块,用于当所述子窗口恢复正常后,恢复所述中间窗口与所述子窗口的父子关系,和恢复所述框架父窗口与所述中间窗口的父子关系。
B17、根据B12所述的装置,其特征在于,所述假死子窗口恢复模块包括:
消息循环连接单元,用于将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接;
第三属性设置单元,将所述子窗口对应的中间窗口的属性设置为具有孩子窗口属性;
第四属性设置单元,将假死子窗口对应的中间窗口的父窗口设置为框架父窗口。
B18、根据B14所述的装置,其特征在于:
通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
B19、根据B17所述的装置,其特征在于:
通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
B20、根据B12所述的装置,其特征在于,还包括:
弹出窗口处理单元,用于对于所述子窗口所在线程创建弹出窗口时,查询当前弹出窗口是否在弹出窗口列表中存在;如果存在,调整当前弹出窗口的属性为只依赖所述子窗口所在线程。
B21、根据B12所述的装置,其特征在于,还包括:
窗口销毁单元,用于当所述子窗口退出时,剥离所述中间窗口与所述子窗口与的父子关系,和剥离所述框架父窗口与所述中间窗口的父子关系。
B22、根据B12所述的装置,其特征在于:
所述的框架父窗口为浏览器框架父窗口,所述子窗口为浏览器标签页。
Claims (16)
1.一种窗口防假死方法,其特征在于,包括:
在通过一线程创建子窗口时,先在与窗口系统各子窗口所在线程不同的线程中创建中间窗口;所述中间窗口为当前创建子窗口的父窗口,所述中间窗口的父窗口为框架父窗口;所述当前创建的子窗口所在线程与框架父窗口所在线程不同;
检测各子窗口是否假死,如果一子窗口假死,则将假死子窗口的假死消息发送给相应中间窗口所在的线程;
通过所述中间窗口所在线程将中间窗口和所述假死子窗口从窗口框架中分离;所述的分离包括:分离中间窗口与框架父窗口的父子关系,和中间窗口对应的子窗口的线程输入消息循环与中间窗口对应的框架父窗口的线程输入消息循环的连接关系;
其中,通过以下步骤进行分离:
将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;
将所述子窗口对应的中间窗口的父窗口设置为空;
将所述子窗口对应的中间窗口本身设置为不是孩子窗口的属性。
2.根据权利要求1所述的方法,其特征在于,在将中间窗口和所述子窗口从窗口框架中分离后还包括:
当所述子窗口恢复正常后,恢复所述中间窗口与所述子窗口的父子关系,和恢复所述框架父窗口与所述中间窗口的父子关系。
3.根据权利要求2所述的方法,其特征在于,通过以下步骤恢复所述中间窗口与所述子窗口的父子关系,并恢复所述框架父窗口与所述中间窗口的父子关系:
将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接;
将所述子窗口对应的中间窗口的属性设置为具有孩子窗口属性;
将假死子窗口对应的中间窗口的父窗口设置为框架父窗口。
4.根据权利要求1所述的方法,其特征在于:
通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
5.根据权利要求3所述的方法,其特征在于:
通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
6.根据权利要求1所述的方法,其特征在于:
对于所述子窗口所在线程创建弹出窗口时,查询当前弹出窗口是否在弹出窗口列表中存在;
如果存在,调整当前弹出窗口的属性为只依赖所述子窗口所在线程。
7.根据权利要求1所述的方法,其特征在于:
当所述子窗口退出时,剥离所述中间窗口与所述子窗口与的父子关系,和剥离所述框架父窗口与所述中间窗口的父子关系;
销毁所述子窗口和中间窗口。
8.根据权利要求1所述的方法,其特征在于:
所述的框架父窗口为浏览器框架父窗口,所述子窗口为浏览器标签页。
9.一种窗口防假死装置,其特征在于,包括:
中间窗口创建模块,在与子窗口所在线程不同的线程中创建中间窗口;所述中间窗口为所述子窗口的父窗口,所述中间窗口的父窗口为框架父窗口,所述子窗口所在线程与框架父窗口所在线程不同;
假死窗口检测模块,用于检测各子窗口是否假死,如果所述子窗口假死,则将假死子窗口的假死消息发送给相应中间窗口所在的线程;
分离模块,用于通过所述中间窗口所在线程将中间窗口和所述假死子窗口从窗口框架中分离;所述的分离包括:分离中间窗口与框架父窗口的父子关系,和中间窗口对应的子窗口的线程输入消息循环与中间窗口对应的框架父窗口的线程输入消息循环的连接关系;
其中,所述分离模块包括:
消息循环剥离单元,用于将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;
第一属性设置单元,用于将所述子窗口对应的中间窗口的父窗口设置为空;
第二属性设置单元,用于将所述子窗口对应的中间窗口本身设置为不是孩子窗口的属性。
10.根据权利要求9所述的装置,其特征在于,还包括:
假死子窗口恢复模块,用于当所述子窗口恢复正常后,恢复所述中间窗口与所述子窗口的父子关系,和恢复所述框架父窗口与所述中间窗口的父子关系。
11.根据权利要求9所述的装置,其特征在于,所述假死子窗口恢复模块包括:
消息循环连接单元,用于将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接;
第三属性设置单元,将所述子窗口对应的中间窗口的属性设置为具有孩子窗口属性;
第四属性设置单元,将假死子窗口对应的中间窗口的父窗口设置为框架父窗口。
12.根据权利要求9所述的装置,其特征在于:
通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
13.根据权利要求11所述的装置,其特征在于:
通过中间窗口所在线程调用系统API函数AttachThreadInput将所述子窗口的线程输入消息循环从框架父窗口的线程输入消息循环剥离;或将所述子窗口的线程输入消息循环和框架父窗口的线程输入消息循环连接。
14.根据权利要求9所述的装置,其特征在于,还包括:
弹出窗口处理单元,用于对于所述子窗口所在线程创建弹出窗口时,查询当前弹出窗口是否在弹出窗口列表中存在;如果存在,调整当前弹出窗口的属性为只依赖所述子窗口所在线程。
15.根据权利要求9所述的装置,其特征在于,还包括:
窗口销毁单元,用于当所述子窗口退出时,剥离所述中间窗口与所述子窗口与的父子关系,和剥离所述框架父窗口与所述中间窗口的父子关系。
16.根据权利要求9所述的装置,其特征在于:
所述的框架父窗口为浏览器框架父窗口,所述子窗口为浏览器标签页。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410212088.3A CN104035815B (zh) | 2011-12-29 | 2011-12-29 | 一种窗口防假死方法和装置 |
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201410212088.3A CN104035815B (zh) | 2011-12-29 | 2011-12-29 | 一种窗口防假死方法和装置 |
CN201110452300.XA CN102591711B (zh) | 2011-12-29 | 2011-12-29 | 一种窗口防假死方法和装置 |
Related Parent Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110452300.XA Division CN102591711B (zh) | 2011-12-29 | 2011-12-29 | 一种窗口防假死方法和装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104035815A CN104035815A (zh) | 2014-09-10 |
CN104035815B true CN104035815B (zh) | 2017-12-12 |
Family
ID=51466590
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201410212088.3A Expired - Fee Related CN104035815B (zh) | 2011-12-29 | 2011-12-29 | 一种窗口防假死方法和装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104035815B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104572271B (zh) * | 2015-02-04 | 2018-04-13 | 北京瑞星网安技术股份有限公司 | 多标签页浏览器防假死的方法和系统 |
CN105892817B (zh) * | 2016-04-01 | 2020-05-29 | 腾讯科技(深圳)有限公司 | 应用程序中窗口的控制方法和装置 |
CN107908519B (zh) * | 2017-10-31 | 2021-06-15 | 努比亚技术有限公司 | 卡屏检测方法、移动终端及计算机可读存储介质 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101184300A (zh) * | 2007-12-06 | 2008-05-21 | 中兴通讯股份有限公司 | 一种手机图形系统中的窗口管理方法 |
CN101609470A (zh) * | 2009-07-02 | 2009-12-23 | 腾讯科技(深圳)有限公司 | 一种多页面浏览器防假死方法及装置 |
WO2010083772A1 (zh) * | 2009-01-23 | 2010-07-29 | 北京搜狗科技发展有限公司 | 一种实现多标签应用程序中进行消息交互的方法及系统 |
CN102027454A (zh) * | 2008-05-13 | 2011-04-20 | 谷歌公司 | 多进程浏览器体系结构 |
CN102591711B (zh) * | 2011-12-29 | 2014-06-25 | 奇智软件(北京)有限公司 | 一种窗口防假死方法和装置 |
-
2011
- 2011-12-29 CN CN201410212088.3A patent/CN104035815B/zh not_active Expired - Fee Related
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101184300A (zh) * | 2007-12-06 | 2008-05-21 | 中兴通讯股份有限公司 | 一种手机图形系统中的窗口管理方法 |
CN102027454A (zh) * | 2008-05-13 | 2011-04-20 | 谷歌公司 | 多进程浏览器体系结构 |
WO2010083772A1 (zh) * | 2009-01-23 | 2010-07-29 | 北京搜狗科技发展有限公司 | 一种实现多标签应用程序中进行消息交互的方法及系统 |
CN101609470A (zh) * | 2009-07-02 | 2009-12-23 | 腾讯科技(深圳)有限公司 | 一种多页面浏览器防假死方法及装置 |
CN102591711B (zh) * | 2011-12-29 | 2014-06-25 | 奇智软件(北京)有限公司 | 一种窗口防假死方法和装置 |
Also Published As
Publication number | Publication date |
---|---|
CN104035815A (zh) | 2014-09-10 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN102591711B (zh) | 一种窗口防假死方法和装置 | |
US20210209423A1 (en) | Method and apparatus for training face fusion model and electronic device | |
JP7168578B2 (ja) | 集中レンダリング | |
CN104503783B (zh) | 一种呈现服务器硬件初始化程度的方法及服务器 | |
US10180861B2 (en) | Stream schema resolution and stream tuple processing in a distributed stream-processing system | |
WO2022111238A1 (zh) | 一种直播互动方法及设备 | |
US20050007383A1 (en) | System and method of visual grouping of elements in a diagram | |
US20130232487A1 (en) | Control computer and method for managing virtual machine | |
CN104035815B (zh) | 一种窗口防假死方法和装置 | |
CN111090778B (zh) | 一种图片生成方法、装置、设备及存储介质 | |
CN110114746A (zh) | 显示虚拟现实画面的方法和虚拟现实设备 | |
US9032467B2 (en) | Method and mechanism for efficiently delivering visual data across a network | |
US20210385392A1 (en) | Video processing method, electronic device and storage medium thereof | |
CN103473041B (zh) | 一种可视化的数据处理方法及系统 | |
US20180024713A1 (en) | Adaptive user interface | |
CN106815880B (zh) | 动画复用方法和系统 | |
US20180129401A1 (en) | Synchronized presentation of data in different representations | |
CN114492788A (zh) | 训练深度学习模型的方法和装置、电子设备及存储介质 | |
CN112215243A (zh) | 图像特征提取方法、装置、设备及存储介质 | |
CN111368184B (zh) | 智能语音设备的屏保投放方法、设备及存储介质 | |
US10067775B2 (en) | Guided authoring of interactive content | |
CN111381976B (zh) | 消息提示数据的更新方法、装置、存储介质及计算机设备 | |
CN109819332B (zh) | 一种用于提高获取节目数据性能的方法和装置 | |
CN108132788B (zh) | 一种实时多人互动系统的开发装置、方法及系统 | |
CN116048515A (zh) | 一种虚拟场景编辑方法、装置、设备和可读存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20171212 Termination date: 20211229 |
|
CF01 | Termination of patent right due to non-payment of annual fee |