如何在C中读取最大X秒?

我希望我的程序在FIFO中等待读取内容,但如果读取(我使用std :: fstream)持续时间超过5秒,我希望它退出.

是否可以或者我必须绝对使用警报?

谢谢.

解决方法

我不相信有一种干净的方法可以实现这个只有便携式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_;
};

你需要在每次通话时都这样做.它可能会有点乏味,但即使在客户端代码中可能没有明确支持的情况下,它也会提供一个透明的解决方案来提供超时.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...