【发布时间】:2012-01-24 00:54:06
【问题描述】:
在图形应用程序中,我使用控制台输入执行调试命令。创建控制台时,还会创建一个新线程来收集处理所有输入的用户命令,图形应用程序将继续并行运行。我使用 boost::thread 库。
到目前为止它工作得很好,但是我还没有找到一个很好的解决方案来停止这个线程的执行。线程一直在等待用户输入:
while(appRunning)
{
std::cin>>theUserCommand;
// ...do stuff
}
然后当图形应用程序结束时,它将停止所有控制台功能,其中我包含线程:
appRunning = false;
// do some more related clean up
myListeningThread->join();
如您所见,在调用连接之后,std::cin 将等待用户输入。 我尝试的解决方案之一是创建“合成击键”事件,std::cin 将获得您使用 ENTER 发送的任何值,线程将很好地结束,这个解决方案很糟糕,我不想保留它。 此外,它确实在执行该工具的环境之一中工作,但是当我尝试将它与 UI API 一起使用时失败了。你们能指导我如何以正确的方式解决这个问题吗?不能确定 C++ 文档中是否有一个函数可以停止 std::cin 等待用户输入,并继续执行程序,这是否可能?
编辑:很好,我发现 keybd_event 对于某些环境有点误导,使用 WriteConsoleInput 显式指定输入处理程序效果很好。
【问题讨论】:
-
有几种可能性,但它们都依赖于操作系统。该程序适用于什么操作系统?
-
Win/VStudio9.0,我使用keybd_event作为我提到的解决方案,如果它依赖于操作系统是没有问题的。你会建议我如何解决它?
-
顺便说一句,SetConsoleCtrlHandler 对我不起作用,这将结束应用程序进程,跳过所有清理以结束应用程序。
-
有
close(int),它只是被称为_close,没有任何理由(是的,我不得不将POSIX-API代码移植到Windows,你为什么要问?)但我不会不要指望这会做任何建设性的事情。实际系统调用的等价物是CloseHandle(GetStdHandle(STD_INPUT_HANDLE)))和......我不知道这会对从同一个句柄读取的不同线程产生什么影响。试试看并告诉我们! -
嗯,如果您需要 Vista 或更高版本,CancelSynchronousIo 在这里可能会很有帮助。
标签: c++ windows iostream blocking boost-thread