作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一堆 QWebViews 渲染到一个小部件上。有一点我开始收到错误 QThread::start: Failed to create thread (The access code is invalid.)
。查看 Qt 源代码,似乎 _beginthreadex
正在返回一个空句柄,而 errno 是 ERROR_INVALID_ACCESS
,但我不知道为什么。
这是错误打印时的回溯:
0 qErrnoWarning qglobal.cpp 2451 0x69ccdd3c 1 QThread::start qthread_win.cpp 469 0x69cd5831 2 QThreadPoolPrivate::tryStart qthreadpool.cpp 203 0x69ccc3f5 3 QThreadPool::start qthreadpool.cpp 474 0x69cccdf4 4 QHostInfoLookupManager::work qhostinfo.cpp 633 0x6cb9b071 5 QHostInfoLookupManager::scheduleLookup qhostinfo.cpp 652 0x6cb9b143 6 QHostInfo::lookupHost qhostinfo.cpp 202 0x6cb9a220 7 qt_qhostinfo_lookup qhostinfo.cpp 722 0x6cb9b4b6 8 QAbstractSocket::connectToHostImplementation qabstractsocket.cpp 1427 0x6cbb17f5 9 QAbstractSocket::qt_static_metacall moc_qabstractsocket.cpp 166 0x6cbb4925 10 QMetaMethod::invoke qmetaobject.cpp 1664 0x69dc784f 11 QMetaObject::invokeMethod qmetaobject.cpp 1179 0x69dc6d6b 12 QMetaObject::invokeMethod qobjectdefs.h 418 0x6cd361dd 13 QAbstractSocket::connectToHost qabstractsocket.cpp 1342 0x6cbb13b3 14 QSslSocket::connectToHostImplementation qsslsocket.cpp 1744 0x6cbc7340 15 QSslSocket::qt_static_metacall moc_qsslsocket.cpp 91 0x6cbc93cf 16 QMetaMethod::invoke qmetaobject.cpp 1664 0x69dc784f 17 QMetaObject::invokeMethod qmetaobject.cpp 1179 0x69dc6d6b 18 QMetaObject::invokeMethod qobjectdefs.h 418 0x6cd361dd 19 QAbstractSocket::connectToHost qabstractsocket.cpp 1342 0x6cbb13b3 20 QSslSocket::connectToHostEncrypted qsslsocket.cpp 422 0x6cbc55e1 21 QHttpNetworkConnectionChannel::ensureConnection qhttpnetworkconnectionchannel.cpp 607 0x6cb6191f 22 QHttpNetworkConnectionPrivate::_q_startNextRequest qhttpnetworkconnection.cpp 862 0x6cb5e92c 23 QHttpNetworkConnectionPrivate::queueRequest qhttpnetworkconnection.cpp 501 0x6cb5c57d 24 QHttpNetworkConnection::sendRequest qhttpnetworkconnection.cpp 931 0x6cb5edf2 25 QHttpThreadDelegate::startRequest qhttpthreaddelegate.cpp 291 0x6cb8912a 26 QHttpThreadDelegate::qt_static_metacall moc_qhttpthreaddelegate_p.cpp 113 0x6cbd147c 27 QMetaCallEvent::placeMetaCall qobject.cpp 525 0x69dcf91c 28 QObject::event qobject.cpp 1195 0x69dd08db 29 QApplicationPrivate::notify_helper qapplication.cpp 4551 0x2582f44 30 QApplication::notify qapplication.cpp 3933 0x25808b7 31 QCoreApplication::notifyInternal qcoreapplication.cpp 915 0x69dc0dc6 32 QCoreApplication::sendEvent qcoreapplication.h 231 0x69e35185 33 QCoreApplicationPrivate::sendPostedEvents qcoreapplication.cpp 1539 0x69dc1d2a 34 qt_internal_proc qeventdispatcher_win.cpp 496 0x69de2590 35 USER32!OffsetRect C:\Windows\syswow64\user32.dll 0 0x74cc62fa 36 ?? 0 0x152404 37 ?? 0 0x401 38 ?? 0
The code at the call looks like:
d->handle = (Qt::HANDLE) _beginthreadex(NULL, d->stackSize, QThreadPrivate::start, //d->stackSize is 0
this, CREATE_SUSPENDED, &(d->id));
if (!d->handle) {
qErrnoWarning(errno, "QThread::start: Failed to create thread");
d->running = false;
d->finished = true;
return;
}
为什么会发生这种情况,我该如何解决?
编辑:同样值得注意的是,在中断点正好有 500 个线程。
最佳答案
创建 500 个线程后,很有可能您的进程(用于线程堆栈)中的可用地址空间已用完。在 32 位 Windows 上,进程默认只能获得 2GB 的地址空间(地址空间的上半部分为内核保留)。 500 个 1MB 线程堆栈(默认大小,Qt 可能会更高或更低)加上您的进程进行的所有其他分配很容易用完。
参见 this Old New Thing article了解更多。
可能的修复:
关于c++ - 为什么 _beginthreadex 因 ERROR_INVALID_ACCESS 而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21617623/
我有一堆 QWebViews 渲染到一个小部件上。有一点我开始收到错误 QThread::start: Failed to create thread (The access code is inva
我是一名优秀的程序员,十分优秀!