2013-08-29 22 views
9

Tôi đang sử dụng tiết kiệm Apache trong C++ trên Windows và tôi muốn yêu cầu bạn trợ giúp hủy bỏ hoạt động đọc chặn đang diễn ra. Thao tác đọc (ví dụ - TProtocol :: readByte) bị chặn cho đến khi nhận được dữ liệu. Khi tôi đóng giao thông vận tải từ một chủ đề khác, tôi nhận được một xác nhận không thành công về một con trỏ null.Hủy hoạt động đọc chặn trong Tiết kiệm

Có cách nào khác để hủy hoạt động đọc bị chặn không?

Trả lời

3

nếu bạn đang sử dụng chế độ chặn, do đó, tùy chọn duy nhất để hủy bỏ thao tác đọc được đặt hết thời gian chờ trên TSocket trước khi đọc.

+0

Trong trường hợp này, mọi triển khai TProtocol sẽ không thể phân biệt được giữa "máy chủ chưa gửi dữ liệu" và "người dùng muốn hủy thao tác". Vì chúng tôi không hoạt động qua kết nối nhanh, chúng tôi thực sự cần phân biệt giữa hai trường hợp đó. – Alex

+0

Tại sao bạn quan tâm đến TProtocol? Sẽ có một TimeoutException ném cho cả hai trường hợp sau khi cuộc gọi RPC, và bạn có thể quyết định những gì tiếp theo. – secmask

+0

Vì người dùng mã giao tiếp của chúng tôi sẽ nhận ngoại lệ này trong trường hợp * hợp pháp * mà phản hồi của máy chủ chưa đến. Nếu thời gian chờ của tôi quá dài, phản hồi của việc hủy sẽ quá chậm đối với khách hàng của chúng tôi. Vì chúng tôi hoạt động trong băng thông thấp và môi trường có độ trễ cao, chúng tôi không thể đủ thời gian chờ vì chúng hầu như luôn luôn xảy ra. Tuy nhiên, chúng tôi vẫn muốn hủy. – Alex

5

Giả sử bạn đang chạy trên Windows (theo các thẻ trong câu hỏi của bạn): Bạn có thể hủy thao tác socket chặn với WSACancelBlockingCall (mặc dù thao tác này không còn được dùng nữa, nó vẫn hoạt động). Sau đó, socket của bạn sẽ trả lại mã lỗi WSAEINTR (Interrupted function call) thay vì WSAETIMEDOUT.

Trong chế độ tiết kiệm, bạn có thể sử dụng TSocket::getSocketFD() hoặc TPipe::getPipeHandle() để nhận được xử lý theo sau để hủy thao tác hiện tại.

+0

Thật không may, WSACancelBlockingCall đã bị xóa khỏi Winsock2. Và Tiết kiệm sử dụng Winsock2 (http://msdn.microsoft.com/en-us/library/windows/desktop/ms741547%28v=vs.85%29.aspx). Nhưng đó là một ý tưởng hay. – Alex

+0

Bạn có thể sử dụng chức năng, nó vẫn còn trong Winsock2 (mặc dù nó không được xuất bởi DLL). Nếu bạn không muốn sử dụng hack như vậy, bạn cũng có thể đóng socket từ một thread khác. Thao tác chặn sẽ nhận được lỗi WSA_OPERATION_ABORTED (hoạt động cho các thao tác Winsock2, nhưng KHÔNG cho các thao tác Winsock1). –

Các vấn đề liên quan