Zapytanie http, zwalnianie zasobów

0

Witam wszystkich

Używam biblioteki QHttp w celu wysłania zapytania http. Zapytanie jest nieblokujące.
W swojej klasie tworze obiekt QHttpClient:

client = new QHttpClient();

A następnie wykonuję zapytanie:

bool success = client->request(qhttp::EHTTP_GET, uri,
                    [](QHttpRequest * req)
                    {
						//zapytanie
                    },
					[this, fun](QHttpResponse *res)
					{
						//odpowiedź
					});
					

Zastanawiam się w jaki sposób powinienem usunąć obiekt client po otrzymaniu odpowiedzi z serwera?

Próbowałem wykonać _client->deleteLater() w miejscu odpowiedzi, ale pamięć nie jest zwalniana.
Wydaje mi się dlatego, że client już nie istnieje bo w momencie przyjścia odpowiedzi nie istnieje moja klasa w której wykonuję zapytanie.

Czy może jest lepszy sposób obsługę zapytań nieblokujących?

0

Zbyt kombinujesz. Zrób relacje child-parent dla client.
Ten obiekt nie jest "duży", więc nie ma sensu szukać durnych pseudo usprawnień.
W zamian dostajesz wiele optymalizacji, które będą poprawiać wydajność aplikacji (np persistent connection).

0

Jeśli zrobię taką relację. czyli w mojej klasie wywołam:

client = new QHttpClient(this);

to obiekt zostanie zniszczony zanim odpowiedź z serwera przyjdzie.

Całość u mnie wygląda tak:

  • Przychodzi evnt (np timer)
  • W obsłudze eventu (która trwa krótko) wysyłam zapytanie
  • Tworze obiekt klasy WebClient - to jest ta klasa o której pisałem wcześniej
  • Wywołuje metodę klasy WebClient tj. get lub post
  • W tych metodach mam wysłanie zapytania za pomocą QHttpClient
0

Jeśli rodzić ginie zanim dostałeś odpowiedź, to twój kod ma Undefined Behavior, bo w twoim kodzie jest lambda, która łapie this.
Jeśli rodzić zginął to ta lambda robi coś na martwym obiekcie.

0

A jak zrobić by rodzić zginą, gdy przyjdzie odpowiedź?

0

Jeśli używasz QHttpClient stąd https://github.com/azadkuh/qhttp/blob/master/src/qhttpclient.hpp to klasa ta ma sygnał newResponse(). Zatem kasowanie obiektu można zrobić w slocie odbierającym w taki sposób:

void slotHandlingNewResponse(params)
{
//wpierw obsługa zdarzenia
....
//i na koniec
     if (sender() != nullptr) // dla większego bezpieczeństwa można dać jeszcze drugi warunek && sender()->objectName() == "nazwa jaką nadasz obiektowi QHttpClient który wysyła zapytanie"
     {        
        delete sender();
     }
}

Jeśli to jednak nie jest ten QHttpClient to weź udostępnij deklarację tej klasy.

0

Tak to jest ta biblioteka.
Spróbuję zrobić kasowanie w slocie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1