Seite 1 von 1

File via http runterladen und warten, bis get fertig ist

Verfasst: 7. September 2009 21:12
von everlast
Hi,
ich beschäftige mich im Rahmen eines Praktikums mt Qt und habe folgendes Problem:
ich will von einem Webserver eine Xml Datei herunterladen und dann daraus ein QomDocument erstellen, damit der User die Datei auslesen kann.

jetzt wollte ich wissen, ob es irgendwie möglich ist nach der get-Anfrage an den Server zu warten, bis die Anfrage fertig ist und dann mein QDomDocument erstellen zu können.
Ich weiß, dass ich zum Beispiel auf das Signal requestFinished() reagieren kann aber dann läuft das Hauptprogramm ja trotzdem weiter. (Wird die get-Anfrage eigentlich in einem eigenen Thread abgearbeitet ?)
Mein Problem ist, dass ich dem User erst erlauben darf, das Xml-File auszuwerten, wenn es schon vollständig eingelesen worden ist. Also muss ich irgendwie sicherstellen, dass die get-Anfrage zu Ende ist, bevor das Programm weiterlaufen kann.
Wäre cool, wenn ihr mir helfen könntet.

Mein Code sieht ungefähr so aus:

Code: Alles auswählen

QUrl url("www......")
QBuffer buffer;
QHttp http(url.host());

connect(&http, SIGNAL( requestFinished() ), this, SLOT( createDocument() ));

http.get(url.path(), &buffer);
//hier will ich warten, bis das QDomDocument erzeugt wurde und dann
//erst weitermachen

so in etwas sieht das aus.
Geht das irgendwie, oder gibts noch ne einfachere Methode ?

ciao ;)

Verfasst: 7. September 2009 22:15
von Christian81
Wenn der User nichts machen soll würde ich entweder einen Fortschrittsbalken anzeigen oder eben die betreffenden Aktionen deaktivieren.

Verfasst: 7. September 2009 22:30
von everlast
hi,
also das ganze hat momentan noch keine gui. es bekommt später zwar eine, ich würde das aber gerne soweit zum laufen bringen, dass derjenige, der das dann in die software einbauen soll, sich nicht auch noch damit rumschlagen muss.
In der Doku steht doch, dass get asynchron arbeitet, also müsste es doch irgendwie in nem neuen thread gestartet werden oder ? kann ich irgendwie auf den warten oder sowas in der Richtung ?
ciao

Verfasst: 7. September 2009 23:00
von Christian81
Es gibt keinen Extra Thread - nur die Eventloop.
Und busy-wait ist nicht wirklich sinnvoll da dann alles andere nicht funktioniert und mehr oder weniger einfriert. Das ist definitiv nicht das was Du willst. Dein Ansatz ist deshalb falsch.

Verfasst: 8. September 2009 07:38
von NoRulez
Ich würde das ganze so machen wie Du bereits angefangen hast.
Die ganzen QHttp sachen in einem extra Modul, danach zusätzlich auf den Slot "dataReadProgress" hängen und dort drinnen dann ein Signal emitten.
Der, der die Gui dann macht kann die Signale verwerten und entweder einen ProgressBar einbauen oder drum herum noch ein QThread stülpen usw...


LG NoRulez

Verfasst: 8. September 2009 08:21
von everlast
hi,
alles klar, dann werd ich das wohl so machen müssen.

Hätte aber noch eine theoretische Frage ;)

was passiert denn genau, wenn ich ein http.get aufrufe ? Ich verstehe den Mechanismus, wie die Anfrage bearbeitet wird und das "Hauptprogramm" (mir fällt jetzt grad kein besseres Wort ein) aber gleichzeitig weiterläuft, nicht. Ich habe halt gedacht, dass get irgendwie in nem extra THread bearbeitet wird und ich dann mit irgendwas pthread_join-ähnlichem auf den thread warten kann... Aber wenns keinen extra THread gibt, dann hat sich das wohl erübrigt...

ciao

Verfasst: 8. September 2009 09:58
von NoRulez
Du kannst ja die Aufrufe in einem QThread durchführen und danach das wait vom Thread aufrufen.

LG NoRulez

Verfasst: 8. September 2009 10:24
von everlast
hm und wie mach ich das ? hast du evtl ein kleines Code Beispiel für mich :)
mfg

Verfasst: 8. September 2009 13:04
von NoRulez
Also in etwas wie folgt:

Code: Alles auswählen

MyThread *myThread = new MyThread(/* Hier eventuell gleich parameter mitgeben*/);
myThread->start();
myThread->wait();
MyThread ist dann eine abgeleitete Klasse von QThread in der Du dann in der "run()" Methode Deinen Code schreibst.

LG NoRulez