Sequentielle Http-GET, erst nach antwort weiter

Verschiedenes zu Qt
Antworten
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Sequentielle Http-GET, erst nach antwort weiter

Beitrag von huckleberry »

Hi,

ich habe eine Serverkommunikation und habe dieses Beispiel (http://www.creativepulse.gr/en/blog/201 ... ms-windows) implementiert. Ich möchte hintereinander zwei unterschiedliche GET anfragen an einen Server senden, wobei die zweite anfrage von der Antwort vond er ersten Anfrage anhängt.

Code: Alles auswählen

QString myToken = "";
//..
void MainWindow::firstRequest() {
    QString url_str = "http://www.example.com/path/getToken.php";

    HttpRequestInput input(url_str, "GET");

    HttpRequestWorker *worker = new HttpRequestWorker(this);
    connect(worker, SIGNAL(on_execution_finished(HttpRequestWorker*)), this, SLOT(handle_result(HttpRequestWorker*)));
    worker->execute(&input);
}

void MainWindow::secondRequest() {

   if (myToken.isempty()) firstrequest();

    QString url_str = QString("http://www.example.com/path/token=%1/page.php").arg(myToken);

    HttpRequestInput input(url_str, "GET");

    HttpRequestWorker *worker = new HttpRequestWorker(this);
    connect(worker, SIGNAL(on_execution_finished(HttpRequestWorker*)), this, SLOT(handle_result(HttpRequestWorker*)));
    worker->execute(&input);
}
1. Ich rufe secondrequest() auf. Falls das myToken leer ist (ist es anfangs immer) ruft es davor noch 'schnell' firstRequest() auf.

Im handle_result() wird die Antwort der firstRequest() Anfrage als QString myToken gesetzt. Jedoch wartet meine App nicht, auf die Antwort vom firstrequest(), sondern sendet direkt ohne die Antwort vom firstRequest() eine secindRequest() ??

vorschläge?

Ich danke und viele Grüße
Huck
veeman
Beiträge: 278
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Sequentielle Http-GET, erst nach antwort weiter

Beitrag von veeman »

Liegt wohl daran das nach deiner if Abfrage in secondRequest die Funktion nicht verlassen wird und der nächste Request ausgeführt wird.

Außerdem ist das hier kein schöner Stil:

Code: Alles auswählen

HttpRequestWorker *worker = new HttpRequestWorker(this);
Vor allem wird das Objekt gar nicht gelöscht bis das parent Objekt gelöscht wird.
Damit kann man sich schnell den RAM vollballern.
Zuletzt geändert von veeman am 19. Februar 2015 22:34, insgesamt 1-mal geändert.
huckleberry
Beiträge: 115
Registriert: 2. Oktober 2010 17:07

Re: Sequentielle Http-GET, erst nach antwort weiter

Beitrag von huckleberry »

veeman hat geschrieben:Liegt wohl daran das nach deine if Abfrage in secondRequest die Funktion nicht verlassen wird und der nächste Request.
Verstehe ich nicht?
veeman hat geschrieben:Außerdem ist das hier kein schöner Stil:

Code: Alles auswählen

HttpRequestWorker *worker = new HttpRequestWorker(this);
_worker im Konstruktor = NULL; dann

Code: Alles auswählen

if (_worker == NULL) _worker = new HttpRequestWorker(this);
veeman
Beiträge: 278
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Sequentielle Http-GET, erst nach antwort weiter

Beitrag von veeman »

Sry, hab schneller gedacht als geschrieben.

Code: Alles auswählen

void MainWindow::secondRequest() {

   if (myToken.isempty()) firstrequest(); // <--- Funktion wird aufgerufen, und request eins wird ausgeführt

  // funktion wird nicht verlassen und zweiter request wird ausgeführt
Ja genau im Konstruktor erstellst du das Object einmal und verwendest dieses solange bis du es nicht mehr brauchst.
Dann entfernst du es entweder Manuel oder lässt es den Destruktor von QObject erledigen.
Antworten