【发布时间】: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() { try{if (DetachedThread) {this->Thread.detach();} else {this->Thread.join();}} catch (...){} } 假的,假的没关系。它会自动 FreeConsole()。
标签: c++ multithreading