2010-12-29 16 views
4

私はFILE_FLAG_OVERLAPPEDフラグでCONIN $を開いて、コンソールからの入力を読み込むために重複IOを使用しようとしています。ただし、OVERLAPPEDパラメータを指定しても、ReadFileを使用するとブロックされます。コンソール入力にオーバーラップIOを使用していますか?

これはWindows 7のバグであることを報告している記事を読んでいます。私は可能な7を使用しています。

ここで私が使用しているコードです:

// Create a console window 
AllocConsole(); 
AttachConsole(GetProcessId(GetModuleHandle(NULL))); 

HANDLE overlappedConsoleIn = CreateFile(L"CONIN$", 
           GENERIC_READ, 
           FILE_SHARE_READ, 
           NULL, 
           OPEN_EXISTING, 
           FILE_FLAG_OVERLAPPED | FILE_FLAG_NO_BUFFERING, 
           NULL); 

// Set up the console to work with stdio 
FILE *consoleOut = _fdopen(_open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT), "w"); 
FILE *consoleIn = _fdopen(_open_osfhandle((long)overlappedConsoleIn, _O_TEXT), "r"); 

*stdout = *consoleOut; 
*stdin = *consoleIn; 

setvbuf(consoleOut, NULL, _IONBF, 0); 
setvbuf(consoleIn, NULL, _IONBF, 0); 

std::ios::sync_with_stdio(); 

// Create a completion event 
HANDLE inputEvent = CreateEvent(NULL, true, false, NULL); 

BYTE inputBuffer[128]; 

OVERLAPPED overlappedData; 
overlappedData.Offset = 0; 
overlappedData.OffsetHigh = 0; 
overlappedData.hEvent = inputEvent; 

DWORD numBytesRead = 0; 

// Asynchronously read from console 
ReadFile(overlappedConsoleIn, inputBuffer, 128, &numBytesRead, &overlappedData); 

while(true) 
{ 
    if(WaitForSingleObject(inputEvent, 0) == WAIT_OBJECT_0) 
    { 
     std::cout << "input has been received" << std::endl; 
    } 
    std::cout << "doing something" << std::endl; 
}
+0

他のバージョンのWindowsでも動作しますか? – Mehrdad

答えて

4

を使用すると、パラメータdwFlagsAndAttributesCONIN$またはCONOUT$を開いたときは(CreateFile機能のドキュメントでコンソールを開く方法についての完全な記述である)は無視されます。コンソールを非同期に読み取る場合は、CreateFileによって返されたハンドルをWaitForSingleObject関数に直接渡すことができます。コンソールイベントが保留中の場合、このハンドルが通知され、関数ReadConsoleInputで保留中のイベントを読み込みますか? Hereは、Windowsでコンソールを使用する方法の完全なドキュメントです。

+0

この回答は意味をなさないようです。 WaitForSingleObject()にハンドルを渡すと、その呼び出しが明らかにブロックされるため、非同期IOは許可されません。 – Kyberias

+0

@キベリア:タイムアウトを0にした場合はありません。次に、戻り値は入力キューが空であるかどうかを示します。 –

関連する問題