使用的getch()不结束循环按预期循环条件

问题描述 投票:-1回答:1

我有以下的代码,但它不是结束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是真的吗?

c++ multithreading loops abort control-flow
1个回答
0
投票

循环条件是用一种方式:

  • 如果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()你无论如何必须等待另一个线程来完成。

© www.soinside.com 2019 - 2024. All rights reserved.