C++ std::thread和std::cin.get
我有一个名为DebugConsole的全局变量。它使用Alloc控制台创建控制台,并重定向std::cout和std::cin 问题是,当控制台生成时,一切都很好。但是,当我使用std::cin.get()时,它会阻塞,并且我的应用程序的其余部分是不可单击的。所以我决定线程std::cin.get()。当你按下一个键时,控制台会很好地关闭。当我取消复选框时,问题就出现了。线程无法加入,因为std::cin.get()阻止它移动。因此,我必须在它响应之前先输入。这导致我的整个应用程序冻结 我试着让它,当你按下任何键,它退出我的控制台或当你取消复选框,它关闭我的控制台C++ std::thread和std::cin.get,c++,multithreading,C++,Multithreading,我有一个名为DebugConsole的全局变量。它使用Alloc控制台创建控制台,并重定向std::cout和std::cin 问题是,当控制台生成时,一切都很好。但是,当我使用std::cin.get()时,它会阻塞,并且我的应用程序的其余部分是不可单击的。所以我决定线程std::cin.get()。当你按下一个键时,控制台会很好地关闭。当我取消复选框时,问题就出现了。线程无法加入,因为std::cin.get()阻止它移动。因此,我必须在它响应之前先输入。这导致我的整个应用程序冻结 我试着让
if (ButtonChecked)
{
std::cout<<"To close this window: \nRemove the checkmark from the Extract Box OR Press Any Key..\n"<<std::flush;
DebugConsole.StartThread([window]{ //create an std::thread and run the lambda in it.
std::cin.get();
DebugConsole.StopThread(); //join the thread.
DebugConsole(false, false); //close the console.
UncheckBox(DebugBox);
});
}
else
{
DebugConsole.StopThread(); //basically just joins the thread..
UncheckBox(DebugBox);
}
if(带纽扣)
{
std::cout主线程(在DebugConsole.StartThread()函数调用之后)应该与线程进行连接-当然,它需要知道线程ID,因此您可能需要threadid=DebugConsole.StartThread(…);
才能使其工作。我使用GetAsyncKeyState(VK_RETURN)解决了这个问题&1
而不是std::cin.get()和std::cin.peek()
所有其他代码都很好。只是cin.get和peek没有停止阻止。它阻止我的线程加入/分离,因为它一直在等待用户输入。但是主线程正在else语句中进行连接。它无法加入,因为std::cin.get()阻止线程接收join命令。或者它加入但仍需要我键入..您的新线程尝试加入自身。这是一个问题吗?线程如何停止:S我也尝试了cin.peek。是的,这是一个问题。请思考一下。线程将阻止等待自身完成,这在它从加入返回之前永远不会发生,在从联接返回之前不会发生,不会发生…死锁。联接不会停止线程,它只是等待它停止。另外,如果线程已经联接,即停止运行,那么下面的行(DebugConsole(false,false);UncheckBox(DebugBox);
)将如何运行?我使用这个:void Debug::StopThread(){try{if(DetachedThread){this->Thread.detach();}else{this->Thread.join();}}catch(…){}false不重要。它将自动释放控制台()。