我正在使用Windows,我正在尝试学习管道及其工作原理。
我还没有找到的一件事是如何判断管道上是否有新数据(来自管道的子/接收器端?
通常的方法是有一个读取数据的线程,然后发送它进行处理:
void GetDataThread()
{
while(notDone)
{
BOOL result = ReadFile (pipe_handle, buffer, buffer_size, &bytes_read, NULL);
if (result) DoSomethingWithTheData(buffer, bytes_read);
else Fail();
}
}
问题是ReadFile()函数等待数据,然后它读取它。有没有一种方法可以告诉是否有新数据,而不是实际等待新数据,如下所示:
void GetDataThread()
{
while(notDone)
{
BOOL result = IsThereNewData (pipe_handle);
if (result) {
result = ReadFile (pipe_handle, buffer, buffer_size, &bytes_read, NULL);
if (result) DoSomethingWithTheData(buffer, bytes_read);
else Fail();
}
DoSomethingInterestingInsteadOfHangingTheThreadSinceWeHaveLimitedNumberOfThreads();
}
}
答案 0 :(得分:4)
DWORD total_available_bytes;
if (FALSE == PeekNamedPipe(pipe_handle,
0,
0,
0,
&total_available_bytes,
0))
{
// Handle failure.
}
else if (total_available_bytes > 0)
{
// Read data from pipe ...
}
答案 1 :(得分:1)
另一种方法是使用IPC同步原语,例如事件(CreateEvent())。在使用复杂逻辑进行进程间通信的情况下 - 您也应该关注它们。