std :: thread和std :: cin.get

时间:2012-12-28 17:01:12

标签: c++ multithreading

我有一个名为DebugConsole的全局变量。它使用Alloc Console创建一个控制台,并重定向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);
}

问题的代码在上面。知道如何实现它吗?

2 个答案:

答案 0 :(得分:1)

主线程(在DebugConsole.StartThread()函数调用之后)应该与线程进行连接 - 当然,它需要知道线程ID,因此您可能需要threadid = DebugConsole.StartThread(...);才能使其工作。

答案 1 :(得分:1)

我使用GetAsyncKeyState(VK_RETURN) & 1而不是std :: cin.get()和std :: cin.peek()来解决它。

所有其他代码都没问题。它只是cin.get和peek不会阻止阻止。它阻止我的线程加入/分离,因为它一直在等待用户输入。