Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 命名管道读取超时_C++_Windows_Timeout_Named Pipes - Fatal编程技术网

C++ 命名管道读取超时

C++ 命名管道读取超时,c++,windows,timeout,named-pipes,C++,Windows,Timeout,Named Pipes,我正在尝试为命名管道的读取操作设置超时。 为了从命名管道中读取,我使用了ReadFile函数。 我了解到,可以使用SetCommTimeouts函数为此函数设置超时,但当我尝试使用它时,会出现系统错误1:“函数不正确”。 这是我的代码(这是客户端): 我是否做错了什么,或者SetCommTimeouts方法不应该与管道一起使用?是否有其他方法获得读取超时?不能对命名管道使用SetCommTimeout。如果你想超时,你必须使用异步I/O,并使用 > CaseLeIO < /C>或 CaseLoE

我正在尝试为命名管道的读取操作设置超时。
为了从命名管道中读取,我使用了
ReadFile
函数。
我了解到,可以使用
SetCommTimeouts
函数为此函数设置超时,但当我尝试使用它时,会出现系统错误1:“函数不正确”。
这是我的代码(这是客户端):


我是否做错了什么,或者
SetCommTimeouts
方法不应该与管道一起使用?是否有其他方法获得读取超时?

不能对命名管道使用SetCommTimeout。如果你想超时,你必须使用异步I/O,并使用<代码> > CaseLeIO < /C>或<代码> CaseLoEX < /C> < /P> > P>实现超时。如果超时的目的是不被卡住<代码>永远>代码>,你可以考虑在一个定时循环中调用。通过这种方式,你可以检查是否有任何东西可以随时阅读。
或者,可以使用
PeekNamedPipe
来确定在执行读取之前,管道上的读取是否实际将获得任何。这样可以避免“等待”读取。

读取文件会阻塞,直到读取请求的字节数或发生错误/中止。重叠工作原理相同,即在相同条件下完成。试图使用CancelIoEx实现超时,但发现它丢失了数据。到目前为止,还没有办法实现超时和只读取部分请求的字节数,或者读取缓存数据。

您能解释一下,为什么不能将超时与命名管道一起使用,或者提供指向此知识来源的链接?不幸的是,答案是:“因为您不能:API不允许。”我希望我有一个更好的,更深入的回答给你,唉,我没有。你可能想读书。底线:如果您想要“超时”,您需要使用重叠I/O。好的,谢谢。我考虑使用PeekNamedPipe,但代码“正在构建中”。你是一个英雄。
m_pipe = CreateFileA(pipeName,   // pipe name 
                         GENERIC_READ |  // read and write access 
                         GENERIC_WRITE, 
                         0,              // no sharing 
                         NULL,           // default security attributes
                         OPEN_EXISTING,  // opens existing pipe 
                         0,              // default attributes 
                         NULL);          // no template file 

    if (m_pipe != INVALID_HANDLE_VALUE)
    {
            DWORD mode = PIPE_READMODE_MESSAGE | PIPE_WAIT;
            ok = SetNamedPipeHandleState(m_pipe, &mode, NULL, NULL);
            COMMTIMEOUTS cto;
            cto.ReadTotalTimeoutConstant = 1000;
            BOOL time = SetCommTimeouts(m_pipe, &cto);
    }