可以阻止cin等待input吗?

在graphics应用程序中,我使用控制台input执行debugging命令。 在创build控制台时,还会创build一个新线程来收集处理所有input的用户命令,graphics应用程序将继续并行运行。 我使用boost :: thread库。

它到目前为止工作良好,但我还没有find一个很好的解决scheme来停止执行此线程。 线程始终在等待用户input:

while(appRunning) { std::cin>>theUserCommand; // ...do stuff } 

然后,当graphics应用程序结束时,它将停止所有的控制台function,其中包括线程:

  appRunning = false; // do some more related clean up myListeningThread->join(); 

正如你所看到的,std :: cin将在等待用户input,在联接被调用之后。 我尝试过的一个解决scheme是创build事件“合成键击”,std :: cin将得到你用ENTER发送的任何值,线程将很好地结束,这个解决scheme是可怕的,我不想保留它。 此外,它在工具执行的环境之一中工作,但当我尝试使用它与UI API一起使用失败。 你们能指导我如何以正确的方式解决这个问题? 如果在C ++文档中有一个函数可以阻止std :: cin等待用户input,并且只是继续执行程序,那么还不能确定地说:

编辑:很好,我发现keybd_event是有点误导一些环境,显式指定与WriteConsoleInputinput处理程序工作良好。

Solutions Collecting From Web of "可以阻止cin等待input吗?"

我不是一个Windows程序员,我知道更多关于Unix的东西。 而我完全不熟悉boost::thread 。 这就是说,基于MSDN页面底部的建议,这里是我的建议:

  • 在创建控制台读取线程之前创建一个事件对象 。
  • 当你想关闭时,在调用线程的->join方法之前立即调用事件对象的SetEvent
  • 改变你的控制台阅读线程中的主循环阻塞在WaitForMultipleObjects而不是istream::operator>> ,像这样:

     for (;;) { HANDLE h[2]; h[0] = GetStdHandle(STD_INPUT_HANDLE); h[1] = that_event_object_I_mentioned; DWORD which = WaitForMultipleObjects(2, h, FALSE, INFINITE); if (which == WAIT_OBJECT_0) processConsoleCommand(); else if (which == WAIT_OBJECT_0 + 1) break; else abort(); } 
  • 除了WaitForMultipleObjects调用之外,此线程必须小心不要执行任何阻塞操作。 根据以下注释中的讨论,这意味着processConsoleCommand根本无法使用cin 。 您将需要使用底层的控制台输入函数 ,特别是GetNumberOfConsoleInputEventsReadConsoleInput ,以确保您不会阻止; 您将需要在processConsoleCommand许多调用中累积字符,直到您读取回车符; 你也需要做你自己的回应。