从Delphi中的Thread中释放组件

时间:2015-07-04 07:49:13

标签: multithreading delphi

我写了一个帖子来检查mainform中是否有冻结。我这样做是因为有时TWebbrowser会冻结主UI。我认为这是因为javascript而我无法重现这个问题。

我需要的是安全地停止TWebbrowser的工作。实际上它应该是循环或等待某些东西,但它以某种方式冻结。我需要的是检测并杀死浏览器并重新创建它。

这就是我检测冻结的方法:

bFreeze := SendMessageTimeout(hwn, WM_NULL, 0, 0, SMTO_ABORTIFHUNG OR SMTO_BLOCK, TIME_OUT, iRes) <= 0;

非常感谢任何建议。

由于

1 个答案:

答案 0 :(得分:2)

您正在从程序的主线程运行浏览器控件。任何强行终止浏览器线程的尝试都会导致整个程序崩溃。如果您有可以挂起的代码,并且希望从中恢复,那么期望从主线程运行该代码是不现实的。

现代浏览器通过在不同的进程中隔离每个页面来解决此问题。然后,如果该页面以某种方式挂起或崩溃,则可以杀死页面进程而不会影响浏览器中打开的其他页面。

如果你真的想拥有类似的稳健性,你需要拥有类似的架构。您可能会认为可以在单个进程中隔离线程中的页面,但实际上这并没有给出足够的隔离。

或许更可行的解决方案是首先避免挂起。也许您需要确保使用最新的浏览器引擎。您是否在浏览器功能模拟注册表项中指定了它?