Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::thread和std::cin.get_C++_Multithreading - Fatal编程技术网

C++ std::thread和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()阻止它移动。因此,我必须在它响应之前先输入。这导致我的整个应用程序冻结 我试着让

我有一个名为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不重要。它将自动释放控制台()。