应用程序关闭后,Qtwebengineprocess未关闭。

3

我有一个使用Qt WebEngine的应用程序。但是,我发现在关闭我的应用程序或崩溃后,“Qtwebengineprocess”仍然存在。我的应用程序太大了,不能在此展示,但这里有一个小例子,也说明了这个问题:

#include <QApplication>
#include <QWebEngineView>
#include <QProcess>
#include <QTimer>


int main(int argc, char **argv)
{
    QApplication app(argc, argv);
    QWebEngineView* viewer = new QWebEngineView(NULL);
    viewer->show();
    viewer->load(QUrl("https://www.telegraph.co.uk/content/dam/Pets/spark/royal-canin/tabby-kitten-small.jpg?imwidth=1400"));
    QTimer::singleShot(2000, []() {
        exit(-1);
    });
    app.exec();
    delete viewer;

    return 0;
}

我是否忘记设置某些东西?或者这是Qt的一个bug?提前感谢。更新:Qt 5.11,Win10。

为什么你说"Qtwebengineprocess"仍然存在呢? - undefined
@eyllanesc,因为它仍然存在。我可以在任务管理器中找到它。 - undefined
我刚在Linux上尝试了一下,当窗口关闭时进程就消失了。这个进程会永远存在还是过一段时间就会死掉? - undefined
@eyllanesc,进程永远占用 CPU。我忘了说,我是在 Windows 上进行的。 - undefined
我建议你指明Qt的版本,你的操作系统版本等等,但这似乎是一个bug,请报告它。 - undefined
3个回答

2
我找到了实际的问题和解决方案 - 这里。这是Qt 5.11的一个bug,描述了正好这个问题。
其中一个评论提供了适用于我的解决方案:
When running with QCoreApplication::setAttribute(Qt::AA_UseOpenGLES); 
at the top of the main() function, I'm observing that the qtwebengine process closes correctly, 
both when stopping the debugger and when the release exe crashes.

刚在创建我的qApp之前添加了那一行,没有看到任何崩溃。当然,这样做使用ANGLE和Qt上的动态GPU会有利有弊,更多细节请参考此处

很奇怪,但我第二次尝试这个解决方案,现在它起作用了:/ 的确,再也没有WebEngine进程了。这个解决方案对我来说很好,谢谢! - undefined
1
请注意,根据我在答案中提供的错误网址链接,此问题应该在Qt 5.12版本中得到修复。 - undefined

2

这似乎是PyQt 5.11及以上版本的一个错误。在重新安装操作系统并安装最新版本的PyQt(5.11.3)后,我遇到了这个问题和其他QWebEngineView在布局中无法正确调整大小的问题。降级到PyQt 5.10.1,一切又正常运行。如果使用Python,只需运行以下命令:

pip uninstall PyQt5
pip install PyQt5==5.10.1

谢谢,但我使用的是C++,而不是Python。不过我会在其他版本的Qt上测试这个bug。 - undefined
是的,我错了,没有读标签。但是相同的概念适用,降级到5.10.1版本,然后告诉我们进展如何。 - undefined

1

关于这篇文章的参考,当在main()中调用exit()时,局部作用域对象不会调用析构函数!exit()不会返回。

任何放置在app.exec()之后的代码(在你的情况下是delete viewer;),只有在主事件循环退出并返回给调用者后才会执行。你的定时器从主循环中调用了(stdlib)exit(),这意味着:你正在退出执行而没有返回给调用者,并且在app.exec()之后放置的任何代码都不会被执行。如果你希望你的代码正确运行并执行delete viewer;,那么定时器应该退出主事件循环,因此你需要调用app.quit()app.exit(-1)


是的,我知道。但问题是,即使没有exit(-1),它有时候仍然会出现与问题中相同的行为。而且在Linux中,这个进程无论如何都会被关闭。 - undefined
@user2123079,这几乎是浪费时间。我在(win10/64和Qt5.11/msvc2017 kit)上运行了已更正的代码片段,并没有发现任何错误。 - undefined
进程名称为“Qtwebengineprocess”,它消耗CPU。 - undefined
我在Qt 5.11 / VS 17中观察到同样的问题,只有当您提前终止应用程序时,页面才能正确加载。尝试加载一些需要时间来加载并退出应用程序的重型页面而不是jpg。Webengine进程将不会被终止。如果您在应用程序中同时运行多个QWebEngineView,并且用户过早地终止应用程序,情况会更糟糕。 - undefined
在Qt 5.7中不存在这样的问题。 - undefined
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接