Zapytanie http, zwalnianie zasobów

Odpowiedz Nowy wątek
2018-11-09 10:23
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, żeclient 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?

edytowany 1x, ostatnio: furious programming, 2018-11-09 15:42

Pozostało 580 znaków

2018-11-09 10:30
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).


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2018-11-09 10:31

Pozostało 580 znaków

2018-11-09 10:50
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

Pozostało 580 znaków

2018-11-09 10:57
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22, 2018-11-09 10:58

Pozostało 580 znaków

2018-11-09 11:00
0

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

Pozostało 580 znaków

2018-11-09 11:37
0

Jeśli używasz QHttpClient stąd https://github.com/azadkuh/qh[...]ob/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.


"Sugeruję wyobrazić sobie Słońce widziane z orbity Merkurego, a następnie dupę tej wielkości. W takiej właśnie dupie specjalista ma teksty o wspaniałej atmosferze, pracy pełnej wyzwań i tworzeniu innowacyjnych rozwiązań. Pracuje się po to, żeby zarabiać, a z resztą specjalista sobie poradzi we własnym zakresie, nawet jeśli firma mieści się w okopie na granicy obu Korei."
-somekind,
konkretny człowiek-konkretny przekaz :]
edytowany 2x, ostatnio: MasterBLB, 2018-11-09 11:41

Pozostało 580 znaków

2018-11-09 12:18
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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