2013-04-29 11 views
8

zwykle przykładowy kod korzystania HTTPClientSession wychodzi coś takiego:asynchroniczny odczytać z Poco HTTPClientSession

Poco::Net::HTTPClientSession session(uri.getHost(), uri.getPort()); 
std::ostream& ostr = session.sendRequest(req); 

// Receive the response. 
Poco::Net::HTTPResponse res; 
std::istream& rs = session.receiveResponse(res); 

pytanie brzmi, w jaki sposób można odczytać z wejścia rs strumienia wszystkich danych, upewniając się, że wszystkie operacje nie są blokowane, więc mogę je anulować w dowolnym momencie?

+0

Znaleźliście jakieś rozwiązanie dla tego? – UVV

Odpowiedz

3

Po prostu pomysł, spróbuj umieścić swój kod w wątku.

http://pocoproject.org/slides/130-Threads.pdf

Pozdrowienia

+0

jak by to pomogło? Po prostu zostałby zablokowany ten nowy wątek na czas nieokreślony –

+1

Jeśli umieścisz session.receiveResponse() wewnątrz wątku, nie powinieneś się martwić, czy to blokowanie, czy nie, ponieważ możesz uruchomić swój główny kod w oddzielnym wątku . Jeśli chcesz anulować sekcję blokującą, możesz zabić wątek lub zatrzymać go w uporządkowany sposób. Aby wymieniać dane między wątkami, użyj na przykład referencji/wskaźników lub kolejek zsynchronizowanych z muteksami. Jeśli chcesz zablokować metodę receiveResponse() przez pewien czas, powinieneś sprawdzić Time-Alives (metoda setKeepAliveTimeout) i limity czasu. Powodzenia –

+0

OK, a następnie spróbuj za pomocą metody HTTPClientSession :: setKeepAliveTimeout(), aby skonfigurować mały TimeOut dla bieżącego połączenia. Z dokumentacji "Strumień jest ważny do czasu wywołania metody sendRequest() lub zniszczenia sesji", więc jeśli strumień rs nie otrzyma nic przez określony czas, powinien być kontynuowany bez problemów. –