2

我有一个名为 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);
}

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

4

2 回答 2

1

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

于 2012-12-28T17:22:28.717 回答
1

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

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

于 2012-12-28T20:12:20.573 回答