首页| 论坛| 消息

标题:QThread::start: Failed to create thread (设备不识别此命令。)
作者:shixingya
日期:2018-04-29 19:03
内容:

QThread::start: Failed to create thread (设备不识别此命令。)
这个问题我还是没有绕过它,被困住3天了,有谁遇到过吗?

我用 moveToThread的方式 将多个任务派发给一个线程数组【有30个线程】,但是程序运行时间久 发现子线程数量居然暴涨到630个, 子线程数量暴涨到630个后报错:QThread::start: Failed to create thread (设备不识别此命令。)

我确定程序中只有30个QThread类对象, 其它的如QEventLoop比较多,
急求各位大神给解决问题的思路。。。我怀疑QEventLoop 事件循环也会开启自己的子线程, 是这样的吗?
源码在这里


#1 [yanwuyue 04-29 19:23]
贴代码
#2 [shixingya 04-29 19:26]
void DataServer::send(CloudRequest &request, CloudResponse &response)
{

QNetworkRequest oNetRequest;

oNetRequest.setUrl(QUrl(request.getRequestUrl()));
if(request.getContentType() == ctJson)
oNetRequest.setRawHeader("Content-Type", "application/json");
else if(request.getContentType() == ctXml)
oNetRequest.setRawHeader("Content-Type", "application/xml");
else
oNetRequest.setRawHeader("Content-Type", "application/octet-stream");
if(!m_token.isEmpty())
{
oNetRequest.setRawHeader("Authorization", m_token.toLocal8Bit());
}
oNetRequest.setRawHeader("CLIENTVERSION", ("V1"));

QNetworkAccessManager oNetAccessManager;
QNetworkReply* oNetReply = NULL;

switch (request.getRequestMethod())
{
case rmPut:
oNetReply = oNetAccessManager.put(oNetRequest, *request.getRequestData());
break;
case rmPost:
oNetReply = oNetAccessManager.post(oNetRequest, *request.getRequestData());
break;
case rmGet:
oNetReply = oNetAccessManager.get(oNetRequest);
break;
case rmDelete:
&nbs ..
#3 [shixingya 05-02 20:19]
今天得到一种解决方式 源码在此 源码

之前源码错误有两点:
一、NetworkMgr本来就是异步的,然而没有使用
二、loop是有自己的循环系统的,也就是说和调用主体处于不同的线程中,既然是不同的线程的,那_reply的变量有可能不一致的
#4 [shixingya 05-03 17:37]
找到一个最简单的修改方式
1. 将QNetworkAccessManager *accessManager = new QNetworkAccessManager(/*this*/);
改为
static QNetworkAccessManager *accessManager = new QNetworkAccessManager(/*this*/);
2. 将QEventLoop 替换为
while(_reply->isReadable()==false)
{
QCoreApplication::processEvents();
}

问题解决了,但本人还是有以下两个疑问,希望大家给与解答
1是: 为什么QEventLoop不可以
2是: 为什么QNetworkReply的waitForReadyRead函数不可以

回复 发表
主题 版块