Con*_*ley 6 io winapi visual-c++ overlapped-io
我试图通过使用FILE_FLAG_OVERLAPPED标志打开CONIN $来使用重叠IO来从控制台读取输入.但是,当我使用它时,ReadFile会阻塞,即使使用OVERLAPPED参数也是如此.
我已经阅读了一些报道这是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;
}
Run Code Online (Sandbox Code Playgroud)
当您打开CONIN$
或忽略CONOUT$
参数时dwFlagsAndAttributes
(在CreateFile函数的文档中有关于如何打开控制台的完整描述).如果您想异步读取控制台,可以将CreateFile
直接返回的句柄传递给WaitForSingleObject
函数,如果有任何Console事件处于挂起状态,则会发出此句柄的信号,并使用ReadConsoleInput函数读取待处理事件. 以下是如何在Windows中使用控制台的完整文档.
归档时间: |
|
查看次数: |
2711 次 |
最近记录: |