【发布时间】:2012-04-04 09:55:25
【问题描述】:
我需要知道如何在 linux 环境中使用 C++ 创建计时器或测量 500 毫秒。我尝试使用 gettimeofday 并使用时间结构,但无法获得正确的毫秒精度。我想要做的是让操作持续最多 500 毫秒......在 500 毫秒后会发生其他事情。
【问题讨论】:
我需要知道如何在 linux 环境中使用 C++ 创建计时器或测量 500 毫秒。我尝试使用 gettimeofday 并使用时间结构,但无法获得正确的毫秒精度。我想要做的是让操作持续最多 500 毫秒......在 500 毫秒后会发生其他事情。
【问题讨论】:
#include <chrono>
#include <iostream>
#include <future>
#include <atomic>
void keep_busy(std::chrono::milliseconds this_long,std::atomic<bool> *canceled) {
auto start = std::chrono::high_resolution_clock::now();
while(std::chrono::high_resolution_clock::now() < start+this_long) {
std::cout << "work\n";
std::this_thread::sleep_for(std::chrono::milliseconds(50));
if(canceled->load()) {
std::cout << "canceling op\n";
throw "operation canceled";
}
}
}
int main() {
std::atomic<bool> canceled(false);
auto future = std::async(std::launch::async,
keep_busy,std::chrono::milliseconds(600),&canceled);
std::this_thread::sleep_for(std::chrono::milliseconds(500));
canceled.store(true);
try {
future.get();
std::cout << "operation succeded\n";
} catch( char const *e) {
std::cout << "operation failed due to: " << e << '\n';
}
}
我不完全确定这是正确的......
【讨论】:
由于你是Linux,所以可以使用系统调用usleep
int usleep(useconds_t usec);
这会让你的进程休眠几微秒。
【讨论】:
nanosleep 或者甚至像 poll 这样的多路复用调用(例如,如果您还等待一些输入)
如果您可以访问 C++11,那么最好使用 std::chrono 库
http://en.cppreference.com/w/cpp/chrono/duration
我不完全确定你想用它做什么你想等待正好 500 毫秒吗?
你可以这样做
std::this_thread::sleep_for(std::chrono::milliseconds(500));
您可以通过获取时间指针并检查时间点 - system_time::now() 是否大于 500 毫秒来执行操作直到 500 毫秒过去
//if you compiler supports it you can use auto
std::chrono::system_clock::time_point start=std::chrono::system_clock::now();
while(start-std::chrono::system_clock::now()
< std::chrono::milliseconds(500))
{
//do action
}
如果您没有 C++11,这也适用于 boost chrono 库。这种方法的优点是它是可移植的,不像使用 linux 时间函数。
【讨论】:
您的问题并不清楚为什么您“无法获得正确的精度”或尝试这样做时会发生什么,但如果您在使用 gettimeofday 时遇到问题,请考虑改用 clock_gettime . man clock_gettime了解详情。
【讨论】: