我有以下的代码,但它不是结束while
循环即使done
是真实的。它一直等待_getch()
:
while (done || ((c = _getch()) != EOF))
{
cout << "Operation aborted" << endl;
break;
}
cout << "Operation finished" << endl;
编辑:其实我希望能够中断在另一个线程执行长时间操作。我相信我有while
循环后加入线程。但是,下面的代码,是没有得到,当我按一个键执行循环。
thread t(Start, folder_path);
while (done || ((c = _getch()) != EOF))
{
cout << "Operation aborted" << endl;
exit_signal.set_value();
break;
}
t1.join();
cout << "Operation finished" << endl;
我怎样才能结束循环时done
是真的吗?
循环条件是用一种方式:
done
为真,则逻辑表达式被短路和循环体不评估所述条件的右侧进入。done
是假的,那么_getch()
被调用。如果有一个字符返回,表达式为真,并进入循环体。如果没有可用的字符,_getch()
会等到用户类型之一。只有当遇到结束文件(即按Ctrl + Z在终端模式下输入的,或CIN是从一个文件重定向,并在达到其端部),将循环被中断。如果你想要一个无阻塞键盘输入,你必须先用_kbhit()
,检查一个字符是可用的,然后只读取_getch()
炭。对于Linux kbhit()
,你可以看下here。
编辑:你的多线程编辑
首先,如果done
是在两个线程使用(这显然是的,因为它不是在循环改变)一个变量,确保它它宣布atomic
。如果不是这种情况,你有一个竞争条件是UB。
现在,你的叙述不代码相匹配。如果done
是当另一个线程完成,并要结束这一刻的循环,你需要在!done
循环。
此外,如果要循环,只要其他线程运行,但检查键盘,让用户中断的代码,你最好不要在回路检查。顺便说一句,也可能是去sleep_for
几毫秒的循环体,为了避免浪费,以多CPU查询键盘的选项。
因此,代码最终会像一个结构
std::atomic<bool> done(false);
...
thread t(Start, folder_path);
while (!done)
{
if (_kbhit() && ((c = _getch()) != EOF) { // if keystroke available
cout << "Operation aborted" << endl;
exit_signal.set_value(); // assuming this would make t1 return from folder_path()
break;
}
std::this_thread::sleep_for (std::chrono::milliseconds(500));
// update status bar or do other stuff
}
t1.join();
cout << "Operation finished" << endl;
最后,我不知道是什么exit_signal.set_value();
在做什么。我希望它做一些事情,告诉其他线程停止处理。如果没有,你的循环会完成,但在join()
你无论如何必须等待另一个线程来完成。