QTimer
Verfasst: 2. Februar 2009 13:03
Ich habe ein problem mit QTimer und seiner Threadzugehörigkeit. Ich habe folgendes Programm
Mein Problem: Falls die downloadQueue leer ist bleibt das ganze stehen, obwohl der download vieleicht noch garnicht fertig ist. Es könnte ja passieren, dass das aktuelle reply noch links enthällt. Diese werden aber erst nach downloadQQueue.size() > 0 gefunden. Wenn man erst die neuen links suchen würde und dann neue Downloads startet würde es natürlich gehen. Aber während man analysiert, wird ja nichts mehr geladen. Es entstehen also längere wartezeiten, in denen man nichts runterläd.
Ich habe jetzt veruscht durch einen QTimer das ganze wieder zu triggern falls die queue leer war. Da bekomme ich allerdings fehlermeldungen, dass der Timer nicht von einem anderen Thread gestartet und gestoppt werden kann. Den Timer hab ich sowohl in der run Methode als auch in der downloadFinished Methode erstellt. Geht beides nicht.
Wie gehts richtig?
Laufen die Funktionen die durch timeout() ausgelöst werdem in einem eigenständigen Thread?
Oder hat jemand eine andere Idee wie ich den Timer umgehen kann.
Code: Alles auswählen
class TestClass : public QThread {
private:
QNetworkAccessManager* manager;
QQueue<QString> downloadQueue;
void run() {
manager = new QNetworkAccessManager();
connect(manager, SIGNAL(finished(QNetworkReply*)),
this, SLOT(downloadFinished(QNetworkReply*)));
manager->get(QNetworkRequest(QUrl("http://www.testseite.de/index.html")));
exec();
}
private slots:
void downloadFinished(QNetworkReply*) {
// Starte neuen download falls noch links da sind
if (downloadQQueue.size() > 0) {
manager->get(QNetworkRequest(QUrl(downloadQueue.dequeue())));
}
// Hier bearbeite ich das reply und suche nach neuen links, die ich dann weiter laden will
downloadQueue.enqueue("neue links");
}
}
Ich habe jetzt veruscht durch einen QTimer das ganze wieder zu triggern falls die queue leer war. Da bekomme ich allerdings fehlermeldungen, dass der Timer nicht von einem anderen Thread gestartet und gestoppt werden kann. Den Timer hab ich sowohl in der run Methode als auch in der downloadFinished Methode erstellt. Geht beides nicht.
Wie gehts richtig?
Laufen die Funktionen die durch timeout() ausgelöst werdem in einem eigenständigen Thread?
Oder hat jemand eine andere Idee wie ich den Timer umgehen kann.