Ich habe da so ein kleines Problem.
Ich will eine Datei runterladen. Das funktioniert auch. Da ich aber mehrere Dateien runterladen will, habe ich mir eine Funktion gebastelt, die die Adresse der Datei und den lokalen Dateinamen als Parameter bekommt.
Mein Problem ist nun, dass diese funktion erst zurückkehren sollte, wenn die Datei Fertig runtergeladen ist. So wie ich das aber jetzt habe, wird die Datei in einem neuen Thread runtergeladen während das Hauptprogramm weiterläuft.
Ich könnte jetzt im Hauptprogramm einen while(true)-loop einbauen, der per if einen boolean abfragt und erst, falls dieser true sein sollte, den loop beendet. Den boolean könnte ich per Extrafunktion und dem Signal requestFinished setzen. Ich finde diese "Lösung" aber ziemlich hässlich, ausserdem würde die (soweit ich mich erinnere) den Prozessor ziemlich auslasten, bis die Datei gedownloaded ist.
Ich habe auch schon QTimer in betracht gezogen, aber da das auch nur ein Signal sendet, würde es auf dasselbe rauskommen.
Daher wollte ich fragen, ob hier jemand wüsste, wie ich das besser hinkriegen könnte oder eine alternative Downloadart wüsste.
Die besagte Funktion sieht im Moment so aus:
Code: Alles auswählen
void VCLchecker::downloadFile(string sURL, string sFileName) {
QString qsURL;
qsURL = sURL.c_str();
QString fileName;
fileName = "temp\\";
fileName += sFileName.c_str();
QUrl url(qsURL);
file = new QFile(fileName);
if (!file->open(QIODevice::WriteOnly)) {
QMessageBox::information(this, tr("VCLchecker"), tr("Unable to save the file: %1.").arg(file->errorString()));
delete file;
file = 0;
return;
}
http->setHost(url.host(), 80);
httpRequestAborted = false;
httpGetId = http->get(url.path(), file);
}Die anderen dazugehörigen Funktionen:
Code: Alles auswählen
void VCLchecker::httpRequestFinished(int requestId, bool error)
{
if (httpRequestAborted) {
QMessageBox::information(this, tr("VCLchecker"), tr("Aborted!"));
if (file) {
file->close();
file->remove();
delete file;
file = 0;
}
return;
}
if (requestId != httpGetId) return;
file->close();
if (error) {
file->remove();
QMessageBox::information(this, tr("VCLchecker"),
tr("Downloading of file failed: %1.")
.arg(http->errorString()));
}
delete file;
file = 0;
// hier könnte ich eventuell die Membervariable setzen
}
void VCLchecker::readResponseHeader(const QHttpResponseHeader &responseHeader)
{
if (responseHeader.statusCode() != 200) {
QMessageBox::information(this, tr("VCLchecker"),
tr("Downloading of file failed (statuscode): %1.")
.arg(responseHeader.reasonPhrase()));
httpRequestAborted = true;
http->abort();
return;
}
}Code: Alles auswählen
connect(http, SIGNAL(requestFinished(int, bool)), this, SLOT(httpRequestFinished(int, bool)));
connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), this, SLOT(readResponseHeader(const QHttpResponseHeader &)));Danke schon mal im voraus
EDIT: QTimer, nicht QSleep *ditch*