睡觉产生的线程

时间:2015-04-19 00:18:44

标签: c++ lambda sleep

我想生成一个循环的线程,并不断检查是否按下了键。我试过了:

void EventHandler::listenForPresses(int loopMSDelay) {
    listenOnKeys = true;
    listeningThread = std::thread ([&]{
        do {

            std::cout << "Looped!\n";
            updatePressedKeys();
            actOnPressedKeys();
            std::this_thread::sleep_for(std::chrono::milliseconds(loopMSDelay));

        } while (listenOnKeys);
    });
}

问题是,sleep_for在这种情况下有非常奇怪的行为;它似乎永久地暂停了生成的线程而不是睡眠loopMSDelay毫秒。

没有std::this_thread::sleep_for...行(注释掉它),它运行正常(尽管它比我想要的循环速度快得多)。

使用上面这一行,它会显示&#34;循环播放!&#34;消息一次,然后再也没有(通过&#34;从不&#34;,我等了几分钟,什么都没有)。这表明它出于某种原因在睡眠线上冻结。

我能想到的唯一一件事就是让它感到困惑&#34;因为我在主线程(在sleep_for命名空间中)中调用lambda中的this_thread,但期望它在生成的线程中休眠。

围绕这个最好的方法是什么?我已经知道this_thread::sleep_for是睡觉的首选方式(适合睡觉时),所以我一直使用它,因为再次使用C ++。

1 个答案:

答案 0 :(得分:2)

您的lambda通过引用loopMSDelay捕获,这是一个函数参数,其生命周期在函数调用结束时结束。

这意味着您的线程将持有悬空引用,并在尝试使用它时具有未定义的行为。在实践中,它可能会传递一些随机的大数字(位于loopMSDelay曾经存在的地方)到sleep_for,这解释了你观察到的内容。

使用[=]按值捕获。

相关问题