我目前正在试图制作一个软件,可从Google Drive下载大量文件。下载目前不是问题。使用QNetworkAccessManager时无法启动QThread
不过,我在启动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;
}
的问题是 “的QThread ::开始:无法创建线程()” 时,达到了第500次下载。我试图限制同时运行的下载数量 - 但我总是遇到同样的问题。此外,我试图在完成任务时删除每个下载器 - 它没有别的事情比崩溃的程序;)
我认为它来自一个唯一的过程允许的线程数,但我不能解决它!
有没有人有一个想法,可以帮助我?
谢谢!
你开始自己的线程来运行请求?或者你有多个'QNetworkAccessManager'实例(每个请求可能有一个)?您的目标不需要以上两者。 **你只需要'QNetworkAccessManager'的一个实例和你的主线程**(除此之外)。使用异步API'QNetworkAccessManager'提供。让Qt在可能的情况下处理并发请求的底层细节,你应该没问题。 – Mike
我有QNetworkAccessManager的多个实例,但只有主线程。 当我尝试仅使用QNetworkAccessManager的一个(静态)实例时,我的程序有一个奇怪的行为。它不再工作,文件立即被下载,没有任何内容......并且有更多的文件比预期的更多! – Abrikot
**您需要在您的问题中添加一个[MCVE](https://stackoverflow.com/help/mcve)以便负责。**您必须在代码中做错某些事情才会发生。 – Mike