分段上传在 QObject 中不起作用已移至线程
Multipart Upload not working in QObject moved to thread
我正在尝试使用Qt中的MultiPart将图像上传到我的网络服务器。当我通过按钮从主窗口运行下面的代码时,它工作正常。
当我尝试在从 QObject 继承到线程的类中实现确切的代码时,它没有到达 te SIGNAL/SLOT,也没有上传任何文件。
谁能指出我的错误在哪里?已经有一段时间了,没有任何积极的结果。
谢谢!
线程/工作线程类的实现
#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();
多亏了上面的评论,我能够通过添加事件循环来解决这个问题。
QEventLoop loop;
connect(reply, SIGNAL(finished()),&loop, SLOT(quit()));
loop.exec();
相关文章:
- sigwait() 在多线程程序中不起作用
- MS 本机单元测试 - 断言::线程失败不起作用
- 线程之间的通信不起作用 - C++
- Qt信号和插槽如果从QRunnable或其他线程调用,则不起作用
- 谷歌语音识别不起作用,因为冲突线程Qt C++
- 线程函数参数的前向声明不起作用
- 使用 Visual c++ 进行多线程同步不起作用
- 通知所有在多线程C++不起作用.导致死锁
- 多线程 - 彼得森算法不起作用
- 为什么此C 线程示例不起作用
- Eclipse c++11 线程支持不起作用
- C 11线程不起作用
- WinAPI 的睡眠在子线程中不起作用
- QMutex ,如果线程在起作用,请在此处等待
- 使用CSokcet和CWinThread,来自线程的PostMessage不起作用
- 程序基于用户输入创建多个线程不起作用(cin)
- 线程对象的 WaitForSingleObject 在 DLL 卸载中不起作用
- C++获取线方法不起作用
- 套接字:客户端读取消息时多线程不起作用
- Qt - 同步线程不起作用 - 线程停止但实际上不会停止,有时在不应该停止的时候停止