问题
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