查看完整版本: [-- QThread::start: Failed to create thread (设备不识别此命令。) --]

QTCN开发网 -> Qt基础编程 -> QThread::start: Failed to create thread (设备不识别此命令。) [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

shixingya 2018-04-29 19:03

QThread::start: Failed to create thread (设备不识别此命令。)

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

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

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

[attachment=18866]







yanwuyue 2018-04-29 19:23
贴代码

shixingya 2018-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:
        oNetReply = oNetAccessManager.deleteResource(oNetRequest);
        break;
    default:
        break;
    }
    if(oNetReply ==nullptr)
    {
        qDebug()<<"send error"<<*request.getRequestData();
        QMessageBox::about(nullptr, "错误",QString("发送请求异常").append(*request.getRequestData()));
        return;
    }

    QEventLoop loop;
    connect(oNetReply, SIGNAL(finished()), &loop, SLOT(quit()));
    int tmpResult =loop.exec();   //系统运行时间久 在此报错 QThread::start: Failed to create thread (设备不识别此命令。
    if(tmpResult !=0)
    {
        qDebug()<<"创建loop失败 失败码"<<tmpResult;
        qDebug()<<"send error"<<*request.getRequestData();;
    }


    //记录httpCode
    int httpsCode = oNetReply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
    response.setHttpCode(httpsCode);

    if(oNetReply->error())
    {
        response.setIsError(true);
        response.setErrorMsg(oNetReply->errorString());
        response.setContent(oNetReply->readAll());
    }
    else
    {
        response.setContent(oNetReply->readAll());
    }
}

shixingya 2018-05-02 20:19
今天得到一种解决方式 源码在此 [attachment=18870]源码


之前源码错误有两点:
一、NetworkMgr本来就是异步的,然而没有使用
二、loop是有自己的循环系统的,也就是说和调用主体处于不同的线程中,既然是不同的线程的,那_reply的变量有可能不一致的

shixingya 2018-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函数不可以


查看完整版本: [-- QThread::start: Failed to create thread (设备不识别此命令。) --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled