解决方法
我不相信有一种干净的方法可以实现这个只有便携式C的解决方案.您最好的选择是在
Windows上使用轮询或选择基于* nix的系统和WaitForSingleObject或WaitForMultipleObjects.
您可以通过创建代理streambuffer类来透明地执行此操作,该类将调用转发到实际的streambuffer对象.这将允许您在进行实际读取之前调用相应的等待函数.它可能看起来像这样……
class MyStreamBuffer : public std::basic_streambuf<char> { public: MyStreamBuffer(std::fstream& streamBuffer,int timeoutValue) : timeoutValue_(timeoutvalue),streamBuffer_(streamBuffer) { } protected: virtual std::streamsize xsgetn( char_type* s,std::streamsize count ) { if(!wait(timeoutValue_)) { return 0; } return streamBuffer_.xsgetn(s,count); } private: bool wait() const { // Not entirely complete but you get the idea return (WAIT_OBJECT_0 == WaitForSingleObject(...)); } const int timeoutValue_; std::fstream& streamBuffer_; };
你需要在每次通话时都这样做.它可能会有点乏味,但即使在客户端代码中可能没有明确支持的情况下,它也会提供一个透明的解决方案来提供超时.