多部分上传在 QObject 中不起作用移动到线程

Posted

技术标签:

【中文标题】多部分上传在 QObject 中不起作用移动到线程【英文标题】:Multipart Upload not working in QObject moved to thread 【发布时间】:2016-01-28 23:08:43 【问题描述】:

我正在尝试使用 Qt 中的 MultiPart 将图像上传到我的网络服务器。当我通过一个按钮从我的 MainWindow 运行下面的代码时,它工作正常。

当我尝试在从 QObject 继承的类中实现确切的代码时,该类正在被移动到一个线程中,它没有达到 TE SIGNAL/SLOT 并且没有文件被上传。

谁能指出我的错误在哪里?研究了一段时间,没有任何积极的结果。

谢谢!

线程/worker类的实现

#include "screenshotworker.h"
#include "session.h"
#include "json.h"
#include "mainwindow.h"

#include <QtNetwork>
#include <QByteArray>
#include <QMessageBox>
#include <QDesktopWidget>
#include <QApplication>


ScreenshotWorker::ScreenshotWorker(QObject *parent) : QObject(parent)




void ScreenshotWorker::DoSetup(QThread *cThread, Session *aSession)

   session = aSession;
   connect(cThread, SIGNAL(started()), this, SLOT(DoWork()));


void ScreenshotWorker::DoWork()


    while(session->sessActive)
    

        QHttpMultiPart *multiPart = new QHttpMultiPart(QHttpMultiPart::FormDataType);

        QHttpPart textPart;
        textPart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"session\""));
        textPart.setBody(QByteArray::number(session->session_id));

        QHttpPart imagePart;
        imagePart.setHeader(QNetworkRequest::ContentTypeHeader, QVariant("image/png"));
        imagePart.setHeader(QNetworkRequest::ContentDispositionHeader, QVariant("form-data; name=\"userfile\"; filename=\"screen.png\""));
        QFile *file = new QFile("screen.png");
        file->open(QIODevice::ReadOnly);
        imagePart.setBodyDevice(file);
        file->setParent(multiPart); // we cannot delete the file now, so delete it with the multiPart

        multiPart->append(textPart);
        multiPart->append(imagePart);

        QUrl url("http://........");
        QNetworkRequest request(url);

        QNetworkAccessManager *manager = new QNetworkAccessManager();
        reply = manager->post(request, multiPart);
        multiPart->setParent(reply); // delete the multiPart with the reply


        connect(reply, SIGNAL( uploadProgress(qint64, qint64) ), this, SLOT( uploadProgress(qint64,qint64) ) ) ;
        connect(reply, SIGNAL(finished()), this, SLOT(uploadDone()));

        sleep(10);
     


void ScreenshotWorker::uploadProgress(qint64 bytesSent, qint64 bytesTotal) 
    qDebug() << "Uploaded" << bytesSent << "of" << bytesTotal;


void ScreenshotWorker::uploadDone() 
    qDebug() << "Finished" << reply->errorString() <<reply->attribute( QNetworkRequest::HttpStatusCodeAttribute).toInt();
    qDebug()<<reply->readAll();

    reply->deleteLater();

在按下按钮时调用它,启动线程。

QThread *cThread2 = new QThread();
ScreenshotWorker *cWorker2 = new ScreenshotWorker();

cWorker2->DoSetup(cThread2, mSession);
cWorker2->moveToThread(cThread2);
cThread2->start();

【问题讨论】:

reply-&gt;deleteLater() 看起来很可疑。你确定这是故意的吗? @kfunk 最后复制粘贴到 *** 中。不过还是一样。我用线程工作者类的代码实现更新了帖子。 您是否在cThread2 中创建和启动EventLoop 在连接信号/进行设置之前尝试将工作线程移动到线程 EventLoop 确实没有创建和启动。我已经添加了这个,现在一切正常:) 【参考方案1】:

感谢上面的 cmets,我能够通过添加事件循环来解决这个问题。

QEventLoop loop;        
connect(reply, SIGNAL(finished()),&loop, SLOT(quit()));
loop.exec();

【讨论】:

以上是关于多部分上传在 QObject 中不起作用移动到线程的主要内容,如果未能解决你的问题,请参考以下文章

使用AFnetworking以多部分格式上传图像在ios中不起作用

文件上传控件在 Facebook 应用内浏览器中不起作用

验证拦截器在多线程 Impex 中不起作用

图像上传部分中的跨浏览器图像预览在 ie8 中不起作用

notifyall 在 C++ 多线程中不起作用。造成僵局

在 QObject 之间跨不同线程连接信号/插槽