3

名前付きパイプの読み取り操作にタイムアウトを設定しようとしています。
名前付きパイプから読み取るために、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メソッドはパイプで使用することを想定していませんか? 読み取りタイムアウトを取得する他の方法はありますか?

4

3 に答える 3

15

タイムアウトの目的がスタックしないことである場合は、タイミング ループでPeekNamedPipe(...)foreverを呼び出すことを検討してください。このようにして、時々読むものがあるかどうかを確認できます。または、読み取りが実行されるに、パイプでの読み取りが実際に何かを取得するかどうかを決定するために使用できます。このようにして、「待機中」の読み取りを回避できます。PeekNamedPipe

于 2012-12-08T16:49:21.767 に答える
3

名前付きパイプで SetCommTimeouts を使用することはできません。タイムアウトが必要な場合は、非同期 I/O を使用しCancelIo、またはを使用して自分でタイムアウトを実装する必要があります。CancelIoEx

于 2012-12-07T17:30:44.680 に答える