File via http runterladen und warten, bis get fertig ist

Alles rund um die Programmierung mit Qt
Antworten
everlast
Beiträge: 7
Registriert: 7. September 2009 20:52

File via http runterladen und warten, bis get fertig ist

Beitrag 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 ;)
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Wenn der User nichts machen soll würde ich entweder einen Fortschrittsbalken anzeigen oder eben die betreffenden Aktionen deaktivieren.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
everlast
Beiträge: 7
Registriert: 7. September 2009 20:52

Beitrag 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
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag 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.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag 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
everlast
Beiträge: 7
Registriert: 7. September 2009 20:52

Beitrag 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
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag von NoRulez »

Du kannst ja die Aufrufe in einem QThread durchführen und danach das wait vom Thread aufrufen.

LG NoRulez
everlast
Beiträge: 7
Registriert: 7. September 2009 20:52

Beitrag von everlast »

hm und wie mach ich das ? hast du evtl ein kleines Code Beispiel für mich :)
mfg
NoRulez
Beiträge: 208
Registriert: 19. Juni 2007 15:43

Beitrag 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
Antworten