【发布时间】:2017-03-05 20:58:35
【问题描述】:
我目前正在尝试制作一个可以从 Google 云端硬盘下载大量文件的软件。目前下载不成问题。
不过,我在启动 500 多个同时下载时遇到了问题。我使用的是本教程的略微修改版本:https://wiki.qt.io/Download_Data_from_URL。
这是 .h 文件:
class FileDownloader : public QObject
{
Q_OBJECT
public:
explicit FileDownloader(QUrl url, QObject *parent = 0, int number = 0);
QByteArray downloadedData() const;
void launchNewDownload(QUrl url);
QByteArray m_DownloadedData;
QNetworkReply* reply;
static QNetworkAccessManager *m_WebCtrl;
signals:
void downloaded();
private slots:
void fileDownloaded(QNetworkReply* pReply);
};
这是 .cpp 文件:
QNetworkAccessManager* FileDownloader::m_WebCtrl = nullptr;
FileDownloader::FileDownloader(QUrl url, QObject *parent) :
QObject(parent)
{
if (m_WebCtrl == nullptr) {
m_WebCtrl = new QNetworkAccessManager(this);
}
connect(m_WebCtrl, SIGNAL (finished(QNetworkReply*)),this, SLOT (fileDownloaded(QNetworkReply*)));
launchNewDownload(url);
}
void FileDownloader::launchNewDownload(QUrl url) {
QNetworkRequest request(url);
this->reply = m_WebCtrl->get(request);
}
void FileDownloader::fileDownloaded(QNetworkReply* pReply) {
m_DownloadedData = pReply->readAll();
//emit a signal
pReply->deleteLater();
emit downloaded();
}
QByteArray FileDownloader::downloadedData() const {
return m_DownloadedData;
}
当下载到大约第 500 次时,问题是“QThread::start: Failed to create thread ()”。我试图限制同时运行的下载数量 - 但我总是遇到同样的问题。此外,我尝试在完成任务时删除每个下载器 - 它除了使程序崩溃之外什么也没做;)
我认为它来自唯一进程允许的线程数,但我无法解决它!
有人有什么想法可以帮助我吗?
谢谢!
【问题讨论】:
-
您是否正在启动自己的线程来运行请求?或者您是否有多个
QNetworkAccessManager实例(可能每个请求一个)?您的目标不需要以上两者。 您只需要QNetworkAccessManager的一个实例和您的主线程(仅此而已)。使用QNetworkAccessManager提供的异步 API。尽可能让 Qt 处理并行化请求的低级细节,你应该没问题。 -
我有多个 QNetworkAccessManager 实例,但只有主线程。当我尝试仅使用 QNetworkAccessManager 的一个(静态)实例时,我的程序出现了奇怪的行为。它不再起作用了,文件立即下载,没有任何内容......而且文件比预期的要多!
-
您需要在您的问题中添加一个MCVE 才能回答。您必须在代码中做错了才会发生这种情况。
-
对不起 MCVE,我不使用 StackOverFlow !这是文件,希望够清楚。
-
" 当我将信号连接到插槽时,它会断开前一个插槽。".不,这不是真的。当连接新的信号/槽时,Qt 从不断开旧的槽。您甚至可以多次连接相同的信号/插槽对(这将导致每当发出信号时都会多次调用插槽)。
标签: multithreading qt c++11 qnetworkaccessmanager