not*_*hik 9 c++ windows iostream boost-thread blocking
在图形应用程序中,我使用控制台输入执行调试命令.创建控制台时,还会创建一个新线程来收集处理所有输入的用户命令,图形应用程序继续并行运行.我使用boost :: thread库.
到目前为止它工作得很好,但我还没有找到一个很好的解决方案来停止执行这个线程.线程总是在等待用户输入:
while(appRunning)
{
std::cin>>theUserCommand;
// ...do stuff
}
Run Code Online (Sandbox Code Playgroud)
然后当图形应用程序结束时,它将停止所有控制台功能,其中包括线程:
appRunning = false;
// do some more related clean up
myListeningThread->join();
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,在调用join之后,std :: cin将等待用户输入.我尝试的解决方案之一是创建事件"合成击键",std :: cin将获得你用ENTER发送的任何值,线程将很好地结束,这个解决方案是可怕的,我不想保留它.此外,它确实在工具执行的其中一个环境中工作,但在我尝试将其与UI API一起使用时失败了.你能指导我怎样才能以正确的方式解决这个问题?无法确切地说,如果在C++文档中有一个函数来阻止std :: cin等待用户输入,并且只是继续执行程序,它甚至可能吗?
编辑:很好我发现keybd_event对某些环境有点误导,显式指定WriteConsoleInput工作良好的输入处理程序.
我不是一个Windows程序员,我对Unix了解更多。而且我完全不熟悉boost::thread。也就是说,根据此 MSDN 页面底部的建议,以下是我的建议:
SetEvent在调用线程的->join方法之前立即调用事件对象。将控制台读取线程中的主循环更改为阻塞 inWaitForMultipleObjects而不是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();
}
Run Code Online (Sandbox Code Playgroud)该线程必须注意不要执行除调用之外的任何阻塞操作WaitForMultipleObjects。根据下面评论中的讨论,这意味着根本processConsoleCommand无法使用。cin您将需要使用低级控制台输入函数,特别是GetNumberOfConsoleInputEvents和ReadConsoleInput,以确保您不会阻塞;您将需要在多次调用中累积字符,processConsoleCommand直到您读到回车符;并且您还需要自己进行回声。
| 归档时间: |
|
| 查看次数: |
3532 次 |
| 最近记录: |