C++ 睡在产卵的线上

C++ 睡在产卵的线上,c++,lambda,sleep,C++,Lambda,Sleep,我想生成一个线程,循环并不断检查按键是否被按下。我试过: void EventHandler::listenForPresses(int loopMSDelay) { listenOnKeys = true; listeningThread = std::thread ([&]{ do { std::cout << "Looped!\n"; updatePressedKeys();

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

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);
    });
}
void EventHandler::listenForPresses(int-loopMSDelay){
listenOnKeys=true;
ListingThread=std::thread([&]{
做{

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

这意味着您的线程将持有一个悬空引用,并且在尝试使用它时具有未定义的行为。实际上,它很可能将一些随机大数(位于
loopMSDelay
以前所在的位置)传递给
sleep\u,这解释了您观察到的情况


使用
[=]
按值捕获。

“这表明它出于某种原因冻结在睡眠线上。”您是否在调试器中实际验证了这一点?可能您在
loopMSDelay
中给出了错误的参数?您是否尝试了
睡眠中的固定值,例如:
std::This_thread::sleep_for(std::chrono::seconds(1))
@MrEricSir没有使用“合法”调试器,但我在print语句中包围了它,在它打印之前包围了它,但从来没有在它之后包围过它。@SHR是的,我已经验证了传递它不是一个奇怪的时间。默认时间是100毫秒,我没有用参数调用它,所以它应该检查(理论上),每秒10次。@Carcigenicate无论如何,如果它对变量不起作用,我会检查一个固定常数是否起作用。如果它起作用,则说明您的代码有问题,(可能是一个错误的参数?),如果没有,它可能是一些编译器包等。无论如何,这是一个简单的测试…这实际上很有趣,但非常有意义。我几分钟后会尝试。我想我用一个常量替换了它。抱歉@SHR,你的建议也会解决它。是的,将它更改为按值捕获修复了它。谢谢。