1

私は Windows で作業しており、パイプとその仕組みを学ぼうとしています。

私が見つけていないことの1つは、パイプに新しいデータがあるかどうかをどのように確認できるかです(パイプの子/受信側から?

通常の方法は、データを読み取り、処理のために送信するスレッドを用意することです。

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

2 に答える 2

4

使用PeekNamedPipe():

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 ...
}
于 2012-07-09T14:26:45.360 に答える
1

もう 1 つの方法は、イベント ( CreateEvent() )などの IPC 同期プリミティブを使用することです。複雑なロジックを伴うプロセス間通信の場合、それらにも注意を払う必要があります。

于 2012-07-09T15:37:21.393 に答える