std::thread 和 std::cin.get

Posted

技术标签:

【中文标题】std::thread 和 std::cin.get【英文标题】:std::thread and std::cin.get 【发布时间】:2012-12-28 17:01:12 【问题描述】:

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

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

【问题讨论】:

你的新线程尝试加入自己。 有问题吗?否则线程会如何停止:S 我也尝试过 cin.peek。 是的,这是个问题。想想看。线程将阻塞等待自己完成,这在它从连接返回之前永远不会发生,直到它从连接返回才会发生,这不会发生......死锁。加入不会停止线程,它只是等待它停止。 另外,如果线程已经加入(即停止运行),以下行 (DebugConsole(false, false); UncheckBox(DebugBox);) 将如何运行? 我用这个:void Debug::StopThread() tryif (DetachedThread) this->Thread.detach(); else this->Thread.join(); catch (...) 假的,假的没关系。它会自动 FreeConsole()。 【参考方案1】:

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

【讨论】:

但主线程正在 else 语句中进行连接。但它无法加入,因为 std::cin.get() 阻止线程接收加入命令。或者它加入但仍然需要我输入..【参考方案2】:

我通过使用 GetAsyncKeyState(VK_RETURN) &amp; 1 而不是 std::cin.get() 和 std::cin.peek() 解决了这个问题。

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

【讨论】:

以上是关于std::thread 和 std::cin.get的主要内容,如果未能解决你的问题,请参考以下文章

std::thread 和 std::cin.get

为啥 MinGW 中仍然没有 std::thread、std::promise 和 std::future? win32中promise和futures的替代方案是啥?

std::thread,类构造函数和析构函数

std::thread 管理:用法和最佳实践

带有 winsock 和 std::thread 的 C++ 多线程服务器

debian 和 std::thread c++ 的即时分段错误