gpt4 book ai didi

c++ - 防止 sleep_for 阻塞后台线程

转载 作者:搜寻专家 更新时间:2023-10-31 01:29:44 25 4
gpt4 key购买 nike

我正在用纯 c++11 编写,想在关闭它后做一个简单的“等待 x 秒并打开一个成员变量”。此示例中类的成员变量是“动画”的标志。

        cout << "stop animating!" << endl;
this->animating = false;

async(launch::async, [this] ()
{
this_thread::sleep_for(chrono::seconds{8});
this->animating = true;
std::cout << "start animating!" << std::endl;
});
cout << "i'm here" << endl;

this_thread::sleep_for 会阻止整个程序继续运行(即使它在异步线程中)。因为 8 秒后我没有看到“我在这里”。如果上面的代码按预期工作,我会在“停止动画”后立即看到“我在这里”。这种阻塞对我来说是个问题,因为它会锁定我关心的所有内容,例如继续处理键盘事件等“输入”,并且程序还会停止在屏幕上“绘制”其他对象。

有谁知道如何使用标准 c++11 实现成员变量的简单延迟和异步更改(请不要使用像 boost 这样的框架)

在 iOS 中非常简单:

// Delay execution of my block for 10 seconds.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC),
dispatch_get_main_queue(), ^
{
//do whatever, 10 seconds later
});

最佳答案

根据@user2176127 的评论 - 你试过这个吗? :

cout << "stop animating!" << endl;
this->animating = false;

std::thread delay_thread(
[this]() {
this_thread::sleep_for(chrono::seconds{8});
this->animating = true;
std::cout << "start animating!" << std::endl;
}
);
delay_thread.detach();
std::cout << "I'm here" << std::endl;

另请注意,您可能需要包装 animating std::atomic<> 中的成员,即如果它是 bool它现在变成了 std::atomic<bool> ,以确保您的主线程在实际发生时注意到更改。 (使用 volatile 无济于事。)

关于c++ - 防止 sleep_for 阻塞后台线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49340384/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com