【问题标题】:Execute a function only once insider a loop that is called at each 0.1 seconds c++仅在每 0.1 秒调用一次的循环内执行一次函数 c++
【发布时间】:2025-12-21 10:25:11
【问题描述】:

我的应用程序中有一个Update 函数,它每秒被调用一次。我想做一个语句检查,如果在该更新函数中只执行一次该函数是真的。如果语句为假则重置std::call_once

void Update()
{
    if (cond)
        std::call_once(flag1, [&capture](){ MyFunction(capture.arg); });
    else
        //Some codes to reset call once 
}

我怎样才能重置一次通话?

【问题讨论】:

  • 显而易见的解决方案(互斥锁和 bool 标志替换 once/once_flag 方法)到底对你不起作用?
  • 您使用了错误的工具来完成这项工作。 std::call_once 是一个专门用于特定目的的函数(在应用程序执行期间初始化首次使用的东西)

标签: c++ std-call-once


【解决方案1】:

std::call_once 保证即使在多个线程中也只发生一次,并且您不能重置它,因为它会破坏它的目的。但是你可以试试这个 sn-p,它每 0.1 秒调用一次你的函数。

void Update()
{
    static std::chrono::high_resolution_clock::time_point start_time = std::chrono::high_resolution_clock::now() - std::chrono::milliseconds(100);

    if (std::chrono::high_resolution_clock::now() - start_time >= std::chrono::milliseconds(100)) {

        start_time = std::chrono::high_resolution_clock::now();

        MyFunction(capture.arg); // ensure that your func call takes less than 0.1 sec else launch from a separate thread
    }

}

已编辑: 由于更新已经每 0.1 秒触发一次,你可以在这里使用 std::call_once,或者你可以像这样简单地使用静态标志:

 void Update()
 {
    static bool first_time = true;
    if(first_time) {
       first_time = false;
       MyFunction(capture.arg);
    }
}

【讨论】: