我正在使用Console
类进行控制台IO(现在只是输入),我通过后台线程在我的循环中查询来自std::cin
的输入不断检查输入。然而,虽然它读取输入正常,但我(预期)遇到了一个问题,在我关闭我的主窗口(GLFW)之后,控制台窗口仍然在后台等待关闭或接收输入。我正在寻找一种终止线程的方法,但无法找到有关这种方案的好方法的任何信息。有什么想法吗?
console.h
class Console
{
public:
Console();
~Console();
bool isInputAvailable();
std::string pullLastInput();
private:
bool do_quit;
void thread_input();
std::thread in_thread;
std::queue<std::string> input_queue;
};
console.cpp:
Console::Console() : in_thread(&Console::thread_input, this)
{
do_quit = false;
}
Console::~Console()
{
do_quit = true;
in_thread.join();
}
bool Console::isInputAvailable()
{
return input_queue.size() > 0;
}
std::string Console::pullLastInput()
{
std::string input;
input = input_queue.front();
input_queue.pop();
return input;
}
void Console::thread_input()
{
std::string input;
while (!do_quit)
{
std::cin >> input;
input_queue.push(input);
}
}
答案 0 :(得分:2)
在主窗口中,当使用onClose事件或析构函数退出时,调用std::terminate
或析构函数
背景线程。
终止线程在此解释:How do I terminate a thread in C++11?
在GLFW中关闭事件处理:http://www.glfw.org/docs/latest/group__window.html#gaade9264e79fae52bdb78e2df11ee8d6a
答案 1 :(得分:1)
没有办法可移植。
posix的快速解决方案涉及pthread_cancel
。这将突然终止线程,泄漏终止线程当前持有的任何资源。
由于这个原因通常被认为是一种不好的做法,但在你的情况下,你将终止程序,所以它可能适合你。考虑使用较低级别的I / O重新设计程序,以便您可以对用户输入执行超时等待。
在包含pthread.h
之后,代码的相关更改包括:
Console::~Console()
{
pthread_cancel( in_thread.native_handle() );
in_thread.join();
}
//Get rid of the quit variable
void Console::thread_input()
{
std::string input;
while (true)
{
std::cin >> input;
//Btw, you need a mutex here.
input_queue.push(input);
}
}