Ich versuche gerade, eine Software zu erstellen, die viele Dateien von Google Drive herunterlädt. Das Herunterladen ist derzeit kein Problem.Fehler beim Starten von QThread bei Verwendung von QNetworkAccessManager
Dennoch, ich stoße auf ein Problem beim Starten von mehr als 500 gleichzeitige Downloads. Ich benutze eine leicht modifizierte Version dieses Tutorials: https://wiki.qt.io/Download_Data_from_URL. Hier
ist die h-Datei:
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);
};
Und hier ist die CPP-Datei:
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;
}
Die Frage ist "QThread :: start: Fehler Thread erstellen()", wenn erreicht ungefähr den 500. Download. Ich habe versucht, die Anzahl der gleichzeitig laufenden Downloads zu begrenzen - aber ich bekomme immer das gleiche Problem. Außerdem habe ich versucht, jeden Downloader beim Beenden seiner Aufgabe zu löschen - es hat nichts anderes getan, als das Programm zu stürzen;)
Ich denke, dass es von der Anzahl der Threads kommt, die für einen einzigen Prozess erlaubt sind, aber ich bin nicht in der Lage um es zu lösen!
Hat jemand eine Idee, die mir helfen könnte?
Vielen Dank!
Starten Sie Ihre eigenen Threads, um Anfragen auszuführen?Oder haben Sie mehrere Instanzen von 'QNetworkAccessManager' (möglicherweise einen für jede Anfrage)? Sie brauchen nicht beides für Ihr Ziel. ** Sie benötigen nur eine Instanz von 'QNetworkAccessManager' und Ihren Haupt-Thread ** (und nichts mehr). Verwenden Sie die asynchrone API, die QNetworkAccessManager bereitstellt. Lassen Sie Qt niedrigstufige Details der Parallelisierungsanforderungen behandeln, wenn möglich und Sie sollten in Ordnung sein. – Mike
Ich habe mehrere Instanzen von QNetworkAccessManager, aber nur den Hauptthread. Wenn ich versuche, nur eine (statische) Instanz von QNetworkAccessManager zu verwenden, hat mein Programm ein merkwürdiges Verhalten. Es funktioniert nicht mehr, Dateien werden sofort ohne Inhalt heruntergeladen ... Und es gibt viel mehr Dateien als erwartet! – Abrikot
** Sie müssen eine [MCVE] (https://stackoverflow.com/help/mcve) hinzufügen, damit Ihre Frage beantwortbar ist. ** Sie müssen etwas falsch in Ihrem Code tun, damit dies geschieht. – Mike