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

て烟熏妆下的殇ゞ 提交于 2020-01-15 03:59:05

问题


I need to implement a function that should do specified task for specified duration which is passed to it as parameter (std::chrono::milliseconds).

I have come up with code :

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");
    }

I suppose the code to print Running for 30 seconds and then exit. But it does not do so. How do I achieve such behavior with C++ <chrono>


回答1:


All you really need is to know the end point and then loop until that point is reached:

#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");
}



回答2:


Remove the variable end. You fail to initialize it anyhow.

Replace all uses of it with std::chrono::system_clock::now() directly.

Use std::chrono::milliseconds as your elapsed_time -- why convert to seconds needlessly?

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;
  }
}



回答3:


Your problem is the data operation that you perform.

Have you try to print "elapsed_seconds"?

As explained in the documentation you have to do:

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

By the way, what do you need could be done also with std::future:wait_for as suggested.



来源:https://stackoverflow.com/questions/28768144/running-a-function-for-specified-duration-c-with-chrono

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!