我目前正在試圖製作一個軟件,可從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