如何让 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 设计器一起工作