admin 发表于 2025-11-11 11:52:20

FBrowserCEF3Lib开发手册之正确的关闭姿势和原理解析

      怎么样正确的关闭程序,我相信大部分人应该遇到过,关闭的时候卡顿甚至崩溃,而大部分通用的做法就是直接强制关闭程序,其实这样并不是可取的,直接强制关闭,浏览器内部可能还有收尾的事没干完,你就直接关闭了,可能就会出现缓存异常、设置无法保存等情况,甚至是崩溃;

一、首先我们要先说说“FBrowser_关闭”这个功能

[*]该功能采用的异步的模式执行关闭操作,而为什么采用这种方式,请继续看下面;



[*]在cef中对应的关闭功能是“CefShutdown”,而经过无数的测试,从1.0到现在的5.0这个关闭命令,其实和窗口的关闭事件消息是有冲突的,至于为什么冲突我这边不多说了,敢兴趣的可以自己去下载官方CEF去测试,而就因为会冲突,如果你在窗口即将销毁事件里面直接调用“CefShutdown”功能,就有可能会阻塞这个事件,导致一直关闭不了甚至崩溃,所以这里就必须采用异步,来避免阻塞;所以在我封装的“FBrowser_关闭”功能里面并不是直接执行的“CefShutdown”,而是通过了线程和UI线程做了异步跳转执行,就避免了这个问题;



[*]很多人编程习惯不好,创建了无数个浏览器,啪一下直接关闭程序,完全不给浏览器时间,浏览器数据能不能保存成功与否先不说,崩溃了又嗷嗷叫{:10_579:},也不知道先将创建的浏览关闭后在调用程序的执行关闭,所以为了满足这些特殊的人群,我又在“FBrowser_关闭”里面加了循环关闭所有已经打开浏览器的功能{:10_567:}当然也还是异步!



[*]其实“FBrowser_关闭”还有我框架内部写的内置线程,全局变量等数据的释放;




[*]但是,有了上面几点,难道就能很优雅的关闭了?其实也不然,我不知道细心的小朋友有没有发现,易和火山创建的销毁事件,只要是最后一个窗口,外部也没有处理代码的话,这个事件执行完就会立马结束程序,所以按我们之前的做法直接就在这个程序里面调用异步执行的“FBrowser_关闭”他有没有关闭执行完,你怎么知道?你根本就不知道,因为这完全已经不是你的可控范围了,所以在5.0版本中我又加入了“执行关闭完毕”事件(火山和C#都在初始化事件中),而这个事件是框架内部所有释放动作执行完后才会调用以便告诉你我已经执行完了,你可以干掉自己了{:10_579:}


所以知道了上面的关闭原理,那我们应该怎么优雅的关闭我们的程序了?请往下继续看

二、关闭流程(以易语言为例)
第一步:在你的主窗口中也就是你的最后一个窗口“可否被关闭”事件中执行框架关闭并阻止当前窗口关闭,如下图

ps:
1.其实这里你也可以自己做个关闭按钮,而不用窗口自带得关闭按钮,其实这样做的目的(阻止他关闭)就是为了避免窗口关闭和框架的关闭两者事件消息的冲突和程序关闭了但框架内部还未释放完;
2.这里的“FBrowser_关闭”也可以在设置参数,执行完毕后直接关闭整个程序


第二步:在“执行关闭完毕”事件中,再去处理里程序内部的关闭流程,你可以在这里释放非框架内部的你自己创建的东西或直接关闭整个程序,也可直接修改“是否结束程序”参数让框架来关闭你的程序,如下图

ps:
1.这里框架已经释放完了,千万不要再去操作浏览器相关的东西;
2.这里采用的是单独的线程,如果要执行你的UI相关,最好投递到UI线程(这里是你控件的UI不是浏览器的UI)处理,易一般利用窗口的标签投递,火山可以用自带的投递到主线程处理;
3.事件中是否结束程序这个参数只适用了5.0最新版,请注意!

三、结语

你如果看懂了上面的原理和用意,其实可以自己举一反三,关闭其实也并非非要在窗口事件中处理,至于还能在哪,那就自己感悟吧!{:10_586:}



Cc网络 发表于 2025-11-12 08:12:30

很给力!很给力!很给力!很给力!很给力!

mosheng 发表于 2025-11-11 14:39:58

{:8_513:}{:8_513:}{:8_513:}{:8_513:}{:8_513:}{:8_513:}
页: [1]
查看完整版本: FBrowserCEF3Lib开发手册之正确的关闭姿势和原理解析