QHttp mit mehreren parallelen Verbindungen

Alles rund um die Programmierung mit Qt
Antworten
Locutus

QHttp mit mehreren parallelen Verbindungen

Beitrag von Locutus »

Hallo!

Ich bin im Moment dabei die Download-Engine für mein Programm zu schreiben und bin jetzt bei einem Problem gelandet, wo ich im Moment nicht weiter weiß.

Das Problem liegt daran, das ich mit QHttp mehrere Verbindungen gleichzeitig aufbaue und nicht weiß wie ich die empfangenen Daten dem jeweiligen Auftrag zuordnen soll.
Also im Klartext ruft meine Hauptroutine die URLs so auf:

Code: Alles auswählen

http->request(header, buffer);
Gleichzeitig speichere ich über http->currentId() die vergebene ID in einer QMap, zusammen mit der dazugehörigen URL.

Damit die angekommenen Daten verarbeitet werden können, habe ich zur Zeit zwei Connections erstellt:

Code: Alles auswählen

connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), this, SLOT(Cookie(const QHttpResponseHeader &)));
connect(http, SIGNAL(done(bool)), this, SLOT(Fertig()));
Diese werden auch ordnungsgemäß aufgerufen, nur habe ich jetzt das Problem, daß ich diesen Daten keine URL zuordnen kann.

Das heißt, wenn ich die Daten abschicke über "http->request(header, buffer);" ich von http->currentId() eine 1 als ID bekomme. Wenn dann wenige Momente später das Signal "responseHeaderReceived" ausgelöst wird und ich in der Funktion Cookie lande, erhalte ich über http->currentId() eine 3 zurück. Ich hab's mehrfach getestet und die Werte sind immer dieselben, obwohl ich nur eine QHttp-Request geschaltet habe.

Ich habe auch schon versucht die Connections so zu verändern, das sie http->currentId() an Cookie liefern, aber das klappte auch nicht.

Deshalb meine Frage, wie kann ich eindeutig feststellen zu welchem Request die empfangenen Daten gehören?
Im Moment stehe ich da auf dem Schlauch.

Gruß,
Locutus
Zuletzt geändert von Locutus am 13. Dezember 2006 14:26, insgesamt 1-mal geändert.
Locutus

Beitrag von Locutus »

Hab's gerade selber herausgefunden wie man das Problem lösen kann. Mit dem QSignalMapper kann man den Signalen einen eindeutigen Sender zuordnen.
Locutus

Beitrag von Locutus »

Schade, leider zu früh gefreut. Ich kann mein Problem nur zum Teil mit QSignalMapper lösen.

Man kann mit QSignalMapper nur einen Parameter übergeben, im Fall von

Code: Alles auswählen

connect(http, SIGNAL(responseHeaderReceived(const QHttpResponseHeader &)), this, SLOT(Cookie(const QHttpResponseHeader &))); 
ist aber das Problem, daß hier bereits ein Parameter (QHttpResponseHeader &) mit übergeben wird.
Mit QSignalMapper kann ich nun meine benötigte ID dranhängen, verliere dann aber die Daten aus dem QHttpResponseHeader& oder übergebe QHttpResponseHeader& und habe dann keine ID mehr (also nichts anderes als eine normale Connect-Anweisung). :?

Also falls da jemand mehr wüßte, wäre ich über eine Antwort dankbar.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QObject::sender() sagt dir, welches Object ein Signal gesendet hat...
Locutus

Beitrag von Locutus »

Danke erst einmal für den Hinweis, allerdings bin ich mir noch nicht ganz im Klaren wie ich damit weiterkomme.

Wenn ich QObject::sender() benutze, bekomme ich ein QHttp-Objekt zurück.

Code: Alles auswählen

QHttp *tzt = new QHttp(QObject::sender());
QString Ergebnis= tzt->lastResponse().toString();
Angenommen ich würde QSignalMapper benutzen um die interne ID zu übermitteln, dann müßte ich mit QObject::sender() den Header auslesen müssen und genau da haperts.

Ich hab's auch mit currentRequest probiert, aber ich bekomme so nicht die richtigen Daten, die ich sonst über SLOT(Cookie(const QHttpResponseHeader &) bekommen würde.

Hast du da einen Vorschlag, wie ich an die Daten wieder rankomme oder einen anderen Vorschlag wie ich dieses Problem umschiffen kann?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Jeder request gibt dir eine eindeutige ID zurück.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Locutus

Beitrag von Locutus »

Christian81 hat geschrieben:Jeder request gibt dir eine eindeutige ID zurück.
Ja das war auch meine erste Idee, allerdings taugen die Werte nichts oder aber ich mache damit was falsch.

Mein Aufruf sieht nun folgendermaßen aus:

Code: Alles auswählen

Einstellungen.http->request(header, buffer);
int Ergebnis= Einstellungen.http->currentId();
Also direkt nach dem Request bekomme ich über currentId() eine 1 zurück. Wenn mein Programm dann über die Connection bei Cookie landet, bekomme ich eine 0.

Der Aufruf sieht wie folgt aus:

Code: Alles auswählen

void test::Cookie(const QHttpResponseHeader &responseHeader){

Einstellungen.http = new QHttp(QObject::sender());
int Ergebnis= Einstellungen.http->currentId();
Mache ich da was falsch oder wieso werden da zwei unterschiedliche IDs zurückgegeben?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Was soll denn Einstellungen.http->currentId() da? Lies mal die Beschreibung und Du siehst dass es Dir absolut nichts nützt.
QHttp::request() gibt dir ne ID zurück. Mit dem signal QHttp::requestFinished() bekommst Du diese ID übergeben und fertig.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
Locutus

Beitrag von Locutus »

Christian81 hat geschrieben:Was soll denn Einstellungen.http->currentId() da? Lies mal die Beschreibung und Du siehst dass es Dir absolut nichts nützt.
QHttp::request() gibt dir ne ID zurück. Mit dem signal QHttp::requestFinished() bekommst Du diese ID übergeben und fertig.
Achso, dann habe ich die Beschreibung missverstanden. Ich habe das so aufgefaßt, daß man über currentId() die aktuelle ID bekommt. :roll:

Allerdings stehe ich jetzt immer noch vor demselben Problem, wie ich das Signal void responseHeaderReceived ( const QHttpResponseHeader & resp ) bei mehreren Requests parallel auswerte.
Ich werde es aber mal mit QHttp::lastResponse probieren, sollte laut Anleitung funktionieren.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Da hast Du recht... aber laut Beschreibung müsste es so ablaufen:

QHttp::request() erzeugt die Signals nach folgenden Muster:
QHttp::requestStarted()
QHttp::responseHeaderReceived()
QHttp::requestFinished()

(siehe auch detailierte Beschreibung)

Schöner wäre es natürlich wenn dort die ID auch mitkommen würde, aber so sollte es auch lösbar sein da alles sequentiell geschieht.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was spricht dagegen mehrere QHttp's zu verwenden?
Locutus

Beitrag von Locutus »

Soderle, ich habe jetzt als Signal QHttp::requestFinished() bei mir eingebaut und lese die Daten mit

Code: Alles auswählen

QString Respond = Einstellungen.http->readAll();	
QString test= Einstellungen.http->lastResponse().toString(); 
aus, scheint alles zu funktionieren. Werde ich morgen mal mit mehreren Downloads gleichzeitig testen.

Danke noch mal für die schnelle Hilfe!
Antworten