【问题标题】:c++ timer linuxc++ 定时器 linux
【发布时间】:2012-04-04 09:55:25
【问题描述】:

我需要知道如何在 linux 环境中使用 C++ 创建计时器或测量 500 毫秒。我尝试使用 gettimeofday 并使用时间结构,但无法获得正确的毫秒精度。我想要做的是让操作持续最多 500 毫秒......在 500 毫秒后会发生其他事情。

【问题讨论】:

标签: c++ linux time timer


【解决方案1】:
#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';
    }
}

我不完全确定这是正确的......

【讨论】:

    【解决方案2】:

    由于你是Linux,所以可以使用系统调用usleep

       int usleep(useconds_t usec);
    

    这会让你的进程休眠几微秒。

    【讨论】:

    • 或者 nanosleep 或者甚至像 poll 这样的多路复用调用(例如,如果您还等待一些输入)
    【解决方案3】:

    如果您可以访问 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 时间函数。

    【讨论】:

    • 1. c++0x 仍处于实验阶段。 2. 等待期间CPU被占用。
    • 1)。在 GCC 上,至少 std::chrono 运行良好,2)。如果您的意思是睡眠功能,那么它将处于空闲状态,如果您的意思是后面的示例,那么它完全按照 OP 想要执行的操作执行操作,直到 500 毫秒过去。我不明白你所说的等待期是什么意思。
    【解决方案4】:

    您的问题并不清楚为什么您“无法获得正确的精度”或尝试这样做时会发生什么,但如果您在使用 gettimeofday 时遇到问题,请考虑改用 clock_gettime . man clock_gettime了解详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多