QThread ASSERT falha no QMutexLocker: “O ponteiro do QMutex está desalinhado”,

Estou tentando criar um remetente que criará novos threads e em cada segmento eu tenho um QNetworkAccessManager. Todos os threads do remetente têm uma referência a uma lista compartilhada e a dividirão usando os índices inicial e fina

O Uploader se parece com isso:

 class FileUploader : public QObject {
    Q_OBJECT

public:
    explicit FileUploader(QList<FileInfoWrapper> &fileList, const int start = 0, const int offset = 0, QObject *parent = 0);


    void uploadNext();

    QString containerName;

private:
    int start_, offset_, iterator_;
    QList<FileInfoWrapper> &fileList_;
    RestFileUploader *restFileUploader;

signals:
    void progressChangedAt(int row);
    void statusChangedAt(int row);
    void finished();

public slots:
    void init();

private slots:
    void setUploadProgress(qint64 tranfered);
    void handleRequestFinished(QNetworkReply* reply);
    void handleSslErros(QNetworkReply *reply, const QList<QSslError> &errors);
    void handleNetworkError(QNetworkReply::NetworkError error);

};

Em seguida, na função run (), crio o novo RestFileUploader (this) (praticamente um objeto que cria seu próprio QNetworkAccessManager (this) e coloca solicitações nele) para que nada seja criado no construtor (o que causaria isso para terminar no segmento principal?). A função de execução cria uma solicitação a ser entregue ao QNetworkAccessManager e, em seguida, não faz nada até que os sinais "terminem (QNetworkReply)" e então pego a próxima (e assim sucessivamente até que a lista seja apresentada).

Então eu crio dois novos threads no aplicativo principal e quando inicio usando run (), ele funciona, exceto que o ID é o mesmo nos dois threads. Se eu chamar "start ()", ele trava com: QObject: Não é possível criar filhos para um pai que esteja em um thread diferente. (Pai é FileUploader (0x2580748), o encadeamento do pai é QThread (0x4fb2b8), o encadeamento atual é FileUploader (0x2580748)

MAS! Antes de começar a percorrer a lista, imprimo o threadId e eles não são mais os mesmo

O que estou fazendo de errado ou devo fazer isso:http: //labs.qt.nokia.com/2006/12/04/threading-without-the-headache ?

Editar

Eu mudei e renomei run para iniciar e criei este wrapper (e não chamo mais NetworkAccessManager ou RestFileUploader com "this"):

FileUploader *fileUploader = new FileUploader(fileList_, start, (offset == 0 ? (fileList_.count() - start) : offset));
QThread *fileUploaderThread = new QThread;
fileUploader->moveToThread(fileUploaderThread);

connect(fileUploader, SIGNAL(progressChangedAt(int)), model_, SLOT(reportProgressChanged(int)));
connect(fileUploader, SIGNAL(statusChangedAt(int)), model_, SLOT(reportStatusChanged(int)));

fileUploaderThread->start();
QMetaObject::invokeMethod(fileUploader, "init", Qt::QueuedConnection);

Quando o upload de um objeto funciona, uma vez que eu só uso um thread. Mas quando tenho mais objetos que eu divido, o aplicativo trava brutalmente com esta mensagem de erro:

ASSERT failure in QMutexLocker: "QMutex pointer is misaligned", file ..\..\include/QtCore/../../../../../../ndk_buildrepos/qt-desktop/src/corelib/thread/qmutex.h, line 100
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.

Por favor me ajud

Editar

fileuploader.cpp

#include "fileuploader.h"

FileUploader::FileUploader(QList<FileInfoWrapper> &fileList, const int start, const int offset, QObject *parent)
    : QObject(parent), start_(start), offset_(offset), iterator_(start - 1), fileList_(fileList) {
}

void FileUploader::init() {
    restFileUploader = new RestFileUploader();

    connect(restFileUploader, SIGNAL(uploadProgress(qint64)), this, SLOT(setUploadProgress(qint64)));
    connect(restFileUploader, SIGNAL(requestFinished(QNetworkReply*)), this, SLOT(handleRequestFinished(QNetworkReply*)));
    connect(restFileUploader, SIGNAL(sslErrors(QNetworkReply*,QList<QSslError>)), this, SLOT(handleSslErros(QNetworkReply*,QList<QSslError>)));
    connect(restFileUploader, SIGNAL(networkError(QNetworkReply::NetworkError)), this, SLOT(handleNetworkError(QNetworkReply::NetworkError)));

    containerName = "temp"

    qDebug() << "thread" << this->thread()->currentThreadId() << start_ << ":" << offset_;

    uploadNext();
}

void FileUploader::uploadNext() {
     qDebug() << "uploadNext" << this->thread()->currentThreadId();

    if((iterator_ + 1) < (start_ + offset_)) {
        iterator_++;

        restFileUploader->putBlob(containerName, fileList_.at(iterator_).fileName(), fileList_.at(iterator_).fileInfo().filePath());

    } else emit finished();
}

void FileUploader::setUploadProgress(qint64 tranfered) {

    fileList_[iterator_].setProgress(tranfered);

    emit progressChangedAt(iterator_);
}

void FileUploader::handleRequestFinished(QNetworkReply* reply) {

    qDebug() << "finished blob: " << iterator_ << " in thread " << this->thread()->currentThreadId();

    if(reply->error() > QNetworkReply::NoError) {
        qDebug() << reply->errorString();

        fileList_[iterator_].uploadFailed();

        emit progressChangedAt(iterator_);

    } else fileList_[iterator_].uploadFinished();

    emit statusChangedAt(iterator_);

    uploadNext();
}

void FileUploader::handleNetworkError(QNetworkReply::NetworkError error) {

    if(error > QNetworkReply::NoError) {
        fileList_[iterator_].uploadFailed();

        restFileUploader->cancelCurrentRequest();

        emit progressChangedAt(iterator_);
        emit statusChangedAt(iterator_);
    }
}

void FileUploader::handleSslErros(QNetworkReply *reply, const QList<QSslError> &errors) {

    if(reply->er,ror() > QNetworkReply::NoError) {

        qDebug() << reply->errorString();

        fileList_[iterator_].uploadFailed();

        restFileUploader->cancelCurrentRequest();

        emit progressChangedAt(iterator_);
        emit statusChangedAt(iterator_);
    }
}

#include "restfileuploader.h"

void RestFileUploader::putBlob(const QString& container, const QString& blob, const QString& filePath) {
    QFile *uploadFile = new QFile(filePath, this); // <--- this maybe?
    uploadFile->open(QIODevice::ReadOnly); 

    QNetworkRequest request = this->createRestRequest("PUT", QString("%1/%2").arg(container, blob), uploadFile->size(), headers);

    reply_ = accessManager_->put(request, uploadFile);

    connect(reply_, SIGNAL(uploadProgress(qint64, qint64)), this, SLOT(reportUploadProgress(qint64, qint64)));
    connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(reportNetworkError(QNetworkReply::NetworkError)));

    qDebug() << this->thread()->currentThreadId();
}

void RestFileUploader::cancelCurrentRequest() {
    reply_->abort();
}

RestFileUploader::~RestFileUploader() {
    qDebug() << "RestFileUploader deleted";

    reply_->deleteLater();
}

Então ... 1 thread com uma coisa para carregar == ok. 2 objetos em dois threads também estão ok. Quando tento fazer upload de 3 ou mais objetos nos dois threads, tudo vai para o infern

Além disso, poderia ter algo a ver com o fato de a interface do usuário estar lendo as informações dos arquivos ao mesmo tempo em que eu as alter

EDIT: Por alguma razão, meu aplicativo agora funciona no 4.8.0 quando eu o compilo no visual studio. Poderia ter algo a ver com a versão 4.7.4?

questionAnswers(6)

yourAnswerToTheQuestion