在指定的持续时间内运行函数:C++<chrono>

Running a function for specified duration : C++ with <chrono>

本文关键字:C++ gt lt chrono 函数 持续时间 运行      更新时间:2023-10-16

我需要实现一个函数,该函数应该在指定的持续时间内完成指定的任务,并作为参数(std::chrono::milliseconds)传递给它。

我想出了一个代码:

void Run(std::chrono::milliseconds ms)
{
    std::chrono::time_point<std::chrono::system_clock> start, end;
    start = std::chrono::system_clock::now();
    std::chrono::duration<double> elapsed_seconds = end - start;
    while (elapsed_seconds <= (ms / 1000))
    {
        std::cout << "Running" << std::endl;
        end = std::chrono::system_clock::now();
        elapsed_seconds = end - start;
    }
}
int main()
{
    {
        std::chrono::milliseconds ms(30000);
        Run(ms);
        system("Pause");
    }

我假设代码打印Running 30秒,然后退出。但它并没有这样做。我如何用C++ <chrono> 实现这样的行为

您真正需要的只是知道end点,然后循环直到到达该点:

#include <chrono>
void Run(std::chrono::milliseconds ms)
{
    std::chrono::time_point<std::chrono::system_clock> end;
    end = std::chrono::system_clock::now() + ms; // this is the end point
    while(std::chrono::system_clock::now() < end) // still less than the end?
    {
        std::cout << "Running" << std::endl;
    }
}
int main()
{
    std::chrono::milliseconds ms(3000);
    Run(ms);
    system("Pause");
}

删除变量end。无论如何,您都无法初始化它。

直接用std::chrono::system_clock::now()替换它的所有用途。

使用std::chrono::milliseconds作为elapsed_time——为什么不必要地转换为秒?

void Run(std::chrono::milliseconds ms)
{
  std::chrono::time_point<std::chrono::system_clock> start
    = std::chrono::system_clock::now();
  auto elapsed_time = [start]()->std::chrono::milliseconds
  {
    return std::chrono::system_clock::now() - start;
  };
  while (elapsed_time() <= ms) {
    std::cout << "Running" << std::endl;
  }
}

您的问题在于执行的数据操作。

你试过打印"elapsed_seconds"吗?

如文档中所述,您必须执行以下操作:

std::chrono::duration_cast<std::chrono::microseconds>(end - start).count()

顺便说一句,你需要什么也可以按照建议用std::future:wait_for。