从另一个线程关闭WINAPI中的重定向控制台



所以我在Win32中创建了一个控制台,旁边是主OpenGL窗口,以便使用它为我的事件循环生成命令。然而,我有一些困难。控制台使用以下循环反复检查cin输入:

while (*loopEnabled)
{
    string str;
    getline(cin, str);
    if (str == "quit")
    {
        PostQuitMessage(0);
        return;
    }
}

这是运行在一个独立的线程从我的主窗口,并意味着发送退出事件和退出。然而,首先,退出消息似乎并不完全有效。似乎发生的是,这只允许主窗口被关闭-我仍然需要手动关闭主窗口。似乎PostQuitMessage不抛出适当的Windows事件让我处理?也许我在这里写错了。

一个更深刻的问题实际上是从控制台线程外部退出此事件循环,而无需输入随机输入以使其移动到常量getline并在条件失败时退出。我试图通过尝试输入虚假输入来做到这一点,但我无法做到这一点。这可能与重定向到控制台的输入有关。也许例外会起作用?我不知道。

以下是将io重定向到控制台的代码:
AllocConsole();
handleOut = GetStdHandle(STD_OUTPUT_HANDLE);
int hCrt = _open_osfhandle((long)handleOut, _O_TEXT);
hfOut = _fdopen(hCrt, "w");
setvbuf(hfOut, NULL, _IONBF, 0); //Can assign custom buffer here! Currently no buffering (_IONBF)
*stdout = *hfOut;
handleIn = GetStdHandle(STD_INPUT_HANDLE);
hCrt = _open_osfhandle((long)handleIn, _O_TEXT);
hfIn = _fdopen(hCrt, "r");
setvbuf(hfIn, NULL, _IOLBF, 256);
*stdin = *hfIn;

概要:我有窗口和控制台。我关闭窗口,它等待控制台输入在循环中获取getline。我在控制台中输入"quit",控制台循环结束,但主窗口没有注意到。帮助吗?- - - - - -。我对Windows编程相当陌生。

PostQuitMessage()向正在调用它的线程的消息队列发送WM_QUIT消息。你的控制台循环运行在它自己的线程中,所以你的主窗口运行在一个不同的线程中永远不会收到WM_QUIT消息。要将WM_QUIT消息发送到另一个线程中的窗口,请使用PostMessage()

std::getline()直到用户在控制台中键入一行文本才退出。如您所见,这并不允许您终止控制台线程。std::cin不会告诉您何时文本可用于阅读,因此您不能仅在有内容可阅读时才调用std::getline()。尝试切换到ReadConsole()ReadConsoleInput()。然后,您可以使用WaitForSingleObject()来检测何时有准备读取的输入。这将使您有机会监视线程在每次读取之间的任何终止条件,例如布尔变量。或者,使用一个可等待事件对象来表示终止,然后您可以使用WaitForMultipleObjects()来同时等待终止和输入,它将告诉您要对哪个信号进行操作。

最新更新