命名pipe道读取超时

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

 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); } 

我做错了什么或SetCommTimeouts方法不应该用于pipe道? 有没有其他的方式来获得阅读超时?

Solutions Collecting From Web of "命名pipe道读取超时"

您不能使用命名管道SetCommTimeouts。 如果你想超时,你将不得不使用异步I / O并使用CancelIoCancelIoEx自己实现超时

如果超时的目的是不被forever卡住,你可以考虑在定时循环中调用PeekNamedPipe(…) 。 这样你可以检查是否有任何东西需要阅读。 或者,也可以使用PeekNamedPipe来决定执行读取之前 ,管道上的读取是否实际上将获取任何内容。 这样可以避免“等待”阅读。

ReadFile块,直到它读取请求的字节数量或错误/中止发生。 重叠的作品是一样的,即它在相同的条件下完成。 试图使用CancelIoEx实现超时,并发现它丢失了数据。 直到现在看不出超时实现,只读部分请求的字节数量,或读取缓存的数据。