如何让 QWebView 释放线程?

Posted

技术标签:

【中文标题】如何让 QWebView 释放线程?【英文标题】:How do I get QWebView to release threads? 【发布时间】:2014-02-07 02:56:40 【问题描述】:

我正在创建很多 QWebViews,每个都创建 QThreads。问题是我用完了堆栈空间来创建更多线程。因此,我想知道是否有办法清理现有线程。需要明确的是,我不是创建这些线程的人:当我显示 QWebView 时,Qt 会创建线程。

大多数线程(大约 400/500)具有完全相同的堆栈:

0 ntdll!RtlEnableEarlyCriticalSectionEventCreation C:\Windows\system32\ntdll.dll 0 0x770b013d
1 KERNEL32!GetVolumePathNamesForVolumeNameA C:\Windows\syswow64\kernel32.dll 0 0x766d1a2c
2 USER32!MessageBoxA C:\Windows\syswow64\user32.dll 0 0x74cd086a
3 QEventDispatcherWin32::processEvents qeventdispatcher_win.cpp 831 0x69de3948
4 QEventLoop::processEvents qeventloop.cpp 149 0x69dbf0c5
5 QEventLoop::exec qeventloop.cpp 204 0x69dbf223
6 QThread::exec qthread.cpp 501 0x69cd412b
7 QThread::运行 qthread.cpp 568 0x69cd4283
8 QThreadPrivate::启动 qthread_win.cpp 346 0x69cd54d1
9 msvcrt!_itow_s C:\Windows\syswow64\msvcrt.dll 0 0x75401287
10 msvcrt!_endthreadex C:\Windows\syswow64\msvcrt.dll 0 0x75401328
11 KERNEL32!BaseCleanupAppcompatCacheSupport C:\Windows\syswow64\kernel32.dll 0 0x766d339a
12 ntdll!RtlpNtSetValueKey C:\Windows\system32\ntdll.dll 0 0x770c9ef2
13 ntdll!RtlpNtSetValueKey C:\Windows\system32\ntdll.dll 0 0x770c9ec5
14 ?? 0

有没有办法清理它们?

【问题讨论】:

假设它们在 QWebView 内部,摆脱它们的唯一方法是删除 QWebView 实例。 (即使您可以关闭 Web 视图背后的线程,它也会破坏 Web 视图的功能)。您在这里一次创建了多少视图? @FrankOsterfeld 显然有几百个......这就是问题所在:我希望能够拥有更多。有没有办法告诉 QWebView 关闭它的线程? 我建议您重新考虑您的设计并避免打开如此多的网页视图。即使我在浏览器中打开数百个选项卡,我预计它也不会始终如一地工作。 鉴于 WebView 有一个 javascript 引擎,您对能够创建数百个的期望比它的时代提前了几年 :) 我相信在 2020 年您将能够在大型零售商处购买具有 64G RAM 的“廉价”桌面系统,然后完成这个噱头 :) @KubaOber 不,javascript 已禁用。因此,不需要 javascript 线程。我认为线程是为异步网络请求分配的。 【参考方案1】:

由于我意识到线程是为 NetworkManager 分配的,我创建了一个全局 NetworkManager 实例并将其设置为每个 QWebView 的 NetworkAccessManager。这允许它为所有页面重用同一组线程,因此不会留下很多线程。

【讨论】:

以上是关于如何让 QWebView 释放线程?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 QtWebKitWidgets.QWebView 与 qt 设计器一起工作

PyQt4中QWebView的多线程

如何设置 QWebView 的套接字选项?

如何在 PyQt 中对 qwebview 应用掩码?

初始评估JavaScript()调用后的PyQt4 QWebview错误

QWebView,如何判断此链接是不是为新窗口?