Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams

I make an http operation(get,post etc...) by using QNetworkAccessManager. I run a few "get" operation in paralel. For this , I use QtConcurrent::run(this,&RestWebservice::GetHTTPData) to make multi HTTP operations. My problem is When I close the app before HTTP operation does not complete , App is crashed.Application Output write this line QMutex: destroying locked mutex then write The program has unexpectedly finished. I guest problem occurs in this line

void RestWebservice::get()
 //  mutex.lock();
  m_networkManager.get(m_networkrequest);
//  mutex.unlock();

But I am not sure because QtCreater Debugger is not good like VS.By the way , GetHTTPData is in different class.

MY CODE for start network Operation:(MobileOperation.cpp).For exapmle getUserAccount metod start a http operation.

void MobileOperations::getWorkOrderListT(int ekipId) {
  MyGlobal::Metods metod=MyGlobal::EkipIsEmriListesi;
    QString parameters="{EkipId}";
    QMap<QString,QVariant> paramlist;
    paramlist["EkipId"]=ekipId;
    GetHTTPData(metod,parameters,paramlist);
    if(m_workorder.IsSuccess==true)
        // emit successupdatewo();
            if(m_workorder.workorders.count()>0)
                InsertWo(json.workorder->workorders);
             emit processstop("İş Emri Listesi Güncellendi");
  void MobileOperations::getUserAccount(QString kullaniciAdi, QString sifre,bool isremember)
    json.user=m_user;
    QtConcurrent::run(this,&MobileOperations::getUserAccountT,kullaniciAdi,sifre,isremember);
   // getUserAccountT(kullaniciAdi,sifre,isremember);
    processstart("Baglaniyor");
void MobileOperations::GetHTTPData(MyGlobal::Metods MetodName, QString Parameters, QMap<QString, QVariant> paramlist)
    parameter=new HttpRequest();
    parameter->url=m_url;
    parameter->metodname=MetodName;
    parameter->resource=m_path;
    parameter->appid=m_appid;
    parameter->apppass=m_apppass;
    parameter->parametersname=Parameters;
    parameter->params=paramlist;
    rest= new RestWebservice(parameter->GenerateHTTPQuery(),MetodName);
   // json=new JSonParser();
  //  loop=new QEventLoop();
     loop=new QEventLoop();
     QObject::connect(rest,SIGNAL(sendhttpdata(QByteArray,MyGlobal::Metods)),&json,SLOT(onGetData(QByteArray,MyGlobal::Metods)));
     QObject::connect(&json,SIGNAL(serilazitionCompleted()),loop,SLOT(quit()));
     rest->get();
     loop->exec();
    catch(std::string &exp)
        qDebug()<<"Sonlandırıldı";

MY CODE of classes For HTTP operatins :

#include "restwebservice.h"
#include <QJsonDocument>
#include<QJsonArray>
#include <QJsonObject>
#include<QJsonValue>
#include<QList>
#include <QThread>
RestWebservice::RestWebservice(QNetworkRequest request,
                               MyGlobal::Metods metod,
                               QObject* parent):QObject(parent),m_networkrequest(request),m_metodname(metod)
    connect(&m_networkManager, SIGNAL(finished(QNetworkReply*)),this, SLOT(onResult(QNetworkReply*)));
//    connect(&m_networkManager,SIGNAL())
void RestWebservice::get()
  //  mutex.lock();
  m_networkManager.get(m_networkrequest);
//  mutex.unlock();
void RestWebservice::post(QString request)
   QByteArray requestA= request.toUtf8();
    m_networkManager.post(m_networkrequest,requestA);
void RestWebservice::onResult(QNetworkReply* reply)
      if (reply->error() != QNetworkReply::NoError)
              qDebug()<<reply->error()<<":"<<reply->errorString();
               MyGlobal::NetworkStatus=reply->errorString();
              emit sendhttpdata(m_data,m_metodname);
              return;
             //  throw(reply->errorString().toStdString());
         QByteArray data = reply->readAll();
         reply->deleteLater();
         m_data=data;
         MyGlobal::NetworkStatus="Tablolar Yüklendi";
        emit sendhttpdata(m_data,m_metodname);
    catch(std::string exp)
        qDebug()<<"Exception:"<<QString::fromStdString(exp);
   catch(std::exception &exp)
        qDebug()<<"Exception:"<<QString::fromStdString(exp.what());
void RestWebservice::onError()
    qDebug()<<"Hata VAR";
HttpRequest::HttpRequest(QObject *parent) :
    QObject(parent)
QNetworkRequest HttpRequest::GenerateHTTPQuery()
  // QString path="";
   QString path=QString("/%1/%2/%3/%4/%5").arg(resource).arg(MyGlobal::getMetodName(metodname)).arg(appid).arg(apppass).arg(parametersname);
   foreach (QString param, params.keys()) {
       path.replace("{"+param+"}",params[param].toString());
    QUrl m_url(url);
    m_url.setPath(path);
    m_request.setUrl(m_url);
    m_request.setRawHeader("Content-Type","application/json;charset=utf-8");
  //  m_request.setRawHeader("SOAPAction","http://tempuri.org/IMobileClient/UserAuth");
    qDebug()<<m_url.url();
    return m_request;
QNetworkRequest HttpRequest::GenerateHTTPQueryPost()
  // QString path="";
   QString path=QString("/%1/%2").arg(resource).arg(MyGlobal::getMetodName(metodname));
    QUrl m_url(url);
    m_url.setPath(path);
    m_request.setUrl(m_url);
    m_request.setRawHeader("Content-Type","application/json;charset=utf-8");
  //  m_request.setRawHeader("SOAPAction","http://tempuri.org/IMobileClient/UserAuth");
    qDebug()<<m_url.url();
    return m_request;
                you don't need to use QtConcurrent::run() to run multiple get operations in parallel, QNetworkAccessManager is asynchronous  so you can start many requests in the same thread and connect their readyRead() signal to slots that handle them. Please show us how exactly your thread works as I think you'll have to change your design. . .
– Mike
                May 22, 2016 at 10:15

Is you mutex a member of your class. In that case the mutex is destructed before it is unlocked (as I presume the containing class goes out of scope), which causes the message you see. The destructor of the mutex is called when the class is destructed, while the lock is held. This is a problem. Typically you will have to find a way to not block indefinitely during your network request.

I don't use mutex . This is not working . I only make try , then commet line which contains mutex. – Kevin yudo May 22, 2016 at 10:34

Thanks for contributing an answer to Stack Overflow!

  • Please be sure to answer the question. Provide details and share your research!

But avoid

  • Asking for help, clarification, or responding to other answers.
  • Making statements based on opinion; back them up with references or personal experience.

To learn more, see our tips on writing great answers.