在C 中,如何在x秒后在类中重置变量

In C++ how to reset variables in a class after X seconds?

本文关键字:变量      更新时间:2023-10-16

我需要在x秒通过后重置某些值。我正在使用这样的东西,但我不知道它可能遇到什么问题:

class Points
{
    public:
        Points();
        ~Points();
        void reset();
        ...
    private:
        int number;
        static void resetAfter5seconds(Points* points);
};

在创建器中,我初始化了一个分离的线:

Points::Points(){
    thread start(resetAfter5seconds, this);
    start.detach();
}
void Points::resetAfter5seconds(Points* points){
   while(true){
     std::this_thread::sleep_for( (std::chrono::seconds(5)));
     points->reset();
   }
}

这有效,但我不知道这是否是正确的方法。它有内存问题吗?,有什么选择?

您的代码不是线程安全的,如果代码的其余部分是单线线程,则使其安全性可能太多了。也许您可能会有一个不需要螺纹功能的简单模式,例如仅检查创建以来5秒的时间是否经过,类似的时间;

class Points
{
public:
    Points() {creationtime = time(0); /* do the rest of init */ }
    ~Points();
    void method1() { test_and_reset(); /* do the rest of logic...*/ }
    void method2() { test_and_reset(); /* do the rest of logic...*/ }
        ...
private:
    time_t creationtime;
    void test_and_reset() {
          time_t now = time(0);
          if (now > creationtime + 5) { /*reset*/ }
    }
};

上面的简单实现还意味着,一旦删除对象,您就不会遇到线程访问无效内存的问题,并且您将不必弄清楚如何杀死胎面。

懒洋洋地做。这里不需要线程。添加getter(私有或公共),仅通过getter访问变量(可能是对应的设置器)。

在Getter中,检查重置时间是否活跃(简单的布尔标志以最大程度地减少开销),然后检查是否过去了足够的时间,然后重置该值。最后像简单的getter一样返回值。


或,如果您的应用程序具有事件循环和事件驱动的体系结构(可能不是在此处添加以完成完整),请添加计时器事件以重置该值。仍然不需要线程使矩阵复杂。