Seite 1 von 1

QHttp mit mehreren parallelen Verbindungen

Verfasst: 13. Dezember 2006 12:08
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

Verfasst: 13. Dezember 2006 13:33
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.

Verfasst: 13. Dezember 2006 14:44
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.

Verfasst: 13. Dezember 2006 15:51
von upsala
QObject::sender() sagt dir, welches Object ein Signal gesendet hat...

Verfasst: 13. Dezember 2006 17:12
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?

Verfasst: 13. Dezember 2006 18:08
von Christian81
Jeder request gibt dir eine eindeutige ID zurück.

Verfasst: 13. Dezember 2006 18:47
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?

Verfasst: 13. Dezember 2006 18:55
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.

Verfasst: 13. Dezember 2006 19:17
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.

Verfasst: 13. Dezember 2006 19:31
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.

Verfasst: 13. Dezember 2006 19:38
von upsala
Was spricht dagegen mehrere QHttp's zu verwenden?

Verfasst: 13. Dezember 2006 22:00
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!