QHttp abwarten, bis es zu Ende ist

Alles rund um die Programmierung mit Qt
Antworten
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

QHttp abwarten, bis es zu Ende ist

Beitrag von FlorianBecker »

Hallo,

ich verzweifel jetzt bald mal an QHttp. Ich mach einen Request auf einen Server und wir tauschen ein paar Daten aus.

Code etwa so:
QHttp *http = new QHttp( server ... );
div. qDebug Mitteilungen über das was QHttp gerade macht.
http -> tueDeinZeug....
qDebug( "Fertig" );

Und der Output sieht dann aber so aus:
Fertig
Verbinden zu Hostname
Senden
Es wurden 3000/3000 Bytes gesendet
Lesen
Es wurden 3000/3000 Bytes gelesen
Verbunden
Verbindung wird geschlossen
Nicht verbunden

Man achte darauf, dass das Fertig als erstes kommt, obwohl es wirklich erst nach QHttp im Code kommt. So ich habe schon probiert das als QThread auszulagern, aber da kann ich auch nicht feststellen, wann er denn nun wirklich fertig ist, ich habe auch schon ein paar andere Dinge probiert, die aber nichtmal annähern von Erfolg gekrönt waren, mit qApp -> processEvents kommt fertig erst nach Verbinden zu Hostname, aber auch wenn ich das 10mal schreibe, oder die Zeit sehr hoch setzt bleibt es immer dort.

Hat jmd. eine Lösung, wie das 100%ig immer erst kommt, wenn QHttp fertig ist. Das Problem ist, dass ich nicht alles nach den Signalen machen kann, weil die QHttp ja nur eine nebenklasse ist. Sowas wie
while ( qhttp )
wait();
wärs halt, aber dafür scheine ich zu doof zu sein, denn Fertig kommt immer vor allem anderen...

Danke für eure Hilfe. Bin schon sehr gespannt, welche Denkfehler ich wieder einmal habe.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

http://qtforum.de/forum/viewtopic.php?t=283
Warum soll es nicht mit Signals & Slots gehen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Weil guck hier:
Tue1();
Tue2();
TueQHttp();
Tue3();
Tue4();

Und wenn du das so macht, macht er aber jetzt Tue1-Tue4 und dann erst TueQHttp, wenn ich das mit requestFinisched mache, gut, ist ja auch ned so das Problem, aber wie lass ich denn die Anwendung nun warten, bis TueQHttp fertig ist!?!?! Wenn ich über Signale gehe, weiss ich zwar, wann er fertig ist, aber bis dahin ist Tue3 und Tue4 immer schon durchgelaufen. Verstehst du?

Ich brauche etwas, das etwa wie so ist:
Tue1();
Tue2();
TueQHttp();
while ( TueQHttp() )
TueNix();
Tue3();
Tue4();

Aber das geht leider irgendwie so gar nicht. Bzw. weiss ich nicht so genau wie man das macht, damit es geht, also es scheint, als wenn QHttp ein eigener Thread ist. Ich weiss einfach nicht weiter...
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Dann warte doch in QHttp::requestFinished() darauf, dass TueQHttp() fertig ist und starte dann Tue3() und Tue4().
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Ja, ok, das wäre wohl eine Lösung, so bin ich die Sache noch nicht angegangen, da ich vom Design her es halt bisher so hatte, dass er alles nach einander durchläuft. Mh, dann leite ich einfach die Signale durch und mache es so in der Main Klasse... Ok, also das scheint vernünftig genug...


Dank dir.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Ich bins nochmal, naja, ok, also das würde gehen, das Problem ist nur ich kann in einer meinetwegen bool Funktion nicht zurückgeben, ob die QHttp abfrage nun erfolgreich war oder nicht. Und das ist doch genau wieder das Problem.

bool MeineKlasse::tue() {

QHttp tueZeugs...
*1
return geht nicht, weil ich auf die Signale warten muss
}

Gibt es noch eine schönere Lösung, dass ich vielleicht einfach bei *1 solange warte, bis die Signale fertig sind, bzw. bis die Abfrage fertig ist!?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Eventuell kannst du solange QHttp::state () abfragen bis er QHttp::Reading erreicht hat. Allerdings solltest du in dieser Warteschleife dann qApp->processEvents () aufrufen damit deine Anwendung zumindest die Systembefehle abarbeiten kann.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Hey, gute Idee. Danke, das mit dem processEvent benutz ich zwar öfters, aber hier hatte ich das noch nicht probiert, führt genau zu der gewünschten Lösung.
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

Hi,
ich denke nicht, dass pollen der eleganteste ansatz ist.
auf der anderen seite wirst du nicht um das splitten der "logik" herumkommen, da das QHTTP geraffel eben asynchron ist.

Ich wuerde auch die weitere verarbeitung, die nach dem beenden des QHTTP zeugs passsieren soll entweder in dem requestFinished slot machen, oder aber in einer eigenen methode....
hier bissi pseudo code....
etwa so.....

Code: Alles auswählen

void
Foo::preHTTPAction()
{
.... 
}

void 
Foo::postHTTPAction
{
  if(m_httpActionOkay)
  {
  ...
  }
  else
  {
    // fehlerbehandlung
  }
}

void
Foo::processHTTP()
{
   preHTTPAction();

   QHTTP .... = http krams....
}

void
Foo::slotHTTPkramFertig()
{
   m_httpActionOkay = !http->error();  // evtl. fehler setzten

   postHTTPAction()
}
Antworten