2013-04-29 31 views
8

mã mẫu thông thường cho việc sử dụng HTTPClientSession đi một cái gì đó như thế này:Async đọc từ 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); 

câu hỏi là, làm thế nào tôi có thể đọc từ rs đầu vào dòng toàn bộ dữ liệu, trong khi đảm bảo rằng tất cả các hoạt động không bị chặn, để tôi có thể hủy chúng bất cứ lúc nào?

+0

Bạn có tìm thấy bất kỳ giải pháp cho việc này? – UVV

Trả lời

3

Chỉ là một ý tưởng, Hãy thử đặt mã của bạn bên trong một chuỗi.

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

Trân

+0

sẽ giúp ích như thế nào? Tôi sẽ chỉ nhận được chủ đề mới này bị chặn trong một khoảng thời gian không giới hạn –

+1

Nếu bạn đặt session.receiveResponse() bên trong một chuỗi, bạn không nên lo lắng về việc nó có bị chặn hay không bởi vì bạn có thể chạy mã chính của mình trong chuỗi phân tách . Nếu bạn muốn hủy bỏ phần chặn, bạn có thể giết chủ đề hoặc ngăn chặn nó theo cách được sắp xếp. Để trao đổi dữ liệu giữa các chủ đề, hãy sử dụng tham chiếu/con trỏ hoặc hàng đợi được đồng bộ hóa với mutexes chẳng hạn. Nếu bạn muốn chặn receiveResponse() trong một thời gian, bạn nên xem Time-Alives (phương thức setKeepAliveTimeout) và timeout. Chúc may mắn –

+0

Ok, sau đó thử với phương thức HTTPClientSession :: setKeepAliveTimeout() để cấu hình một TimeOut nhỏ cho kết nối hiện tại của bạn. Từ tài liệu, "Luồng hợp lệ cho đến khi sendRequest() được gọi hoặc phiên bị hủy", vì vậy nếu luồng rs của bạn không nhận được gì trong một khoảng thời gian, luồng đó sẽ tiếp tục mà không gặp sự cố. –