C++笔记之各种sleep方法总结

时间:2024-10-14 07:35:36

C++笔记之sleep总结

—— 2023年4月9日 上海


code review

文章目录

  • C++笔记之sleep总结
    • ::this_thread::sleep_for()
      • 附:std::this_thread::sleep_for(std::chrono::duration)
    • ::this_thread::sleep_until()
      • 附:std::this_thread::sleep_until(std::chrono::time_point)
    • ::chrono::steady_clock::now()
    • 4.()
    • 4.()
    • 4.回答:sleep()是C语言还是C++中哪个库的函数?
    • 中的ros::Duration::sleep()
    • API——Sleep()函数
    • ++中的wait_for函数
      • 7.::condition_variable::wait_for()
      • 7.::future::wait_for() 或 std::shared_future::wait_for()
    • ::this_thread::sleep(boost::posix_time::milliseconds(200));
    • ::posix_time
    • C++环境中的sleep:QThread::sleep(num)

::this_thread::sleep_for()

该函数属于 C++11 标准,需要包含头文件 <thread>,使用时需要指定休眠的时间长度。
在这里插入图片描述

代码

#include <iostream>
#include <chrono>   // std::chrono::seconds
#include <thread>   // std::this_thread::sleep_for

int main() {
    std::cout << "Start sleeping..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "Wake up!" << std::endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

附:std::this_thread::sleep_for(std::chrono::duration)

在这里插入图片描述

代码

#include <chrono>
#include <thread>

std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 暂停 100 毫秒
  • 1
  • 2
  • 3
  • 4

::this_thread::sleep_until()

该函数属于 C++11 标准,需要包含头文件 <thread>,使用时需要指定休眠的时间点。
在这里插入图片描述

代码

#include <iostream>
#include <chrono>   // std::chrono::system_clock, std::chrono::seconds
#include <thread>   // std::this_thread::sleep_until

int main() {
    std::cout << "Start sleeping..." << std::endl;
    auto wake_up_time = std::chrono::system_clock::now() + std::chrono::seconds(1);
    std::this_thread::sleep_until(wake_up_time);
    std::cout << "Wake up!" << std::endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

附:std::this_thread::sleep_until(std::chrono::time_point)

该函数属于 C++11 标准,需要包含头文件 <thread>,暂停当前线程直到指定时间点。
在这里插入图片描述

代码

#include <chrono>
#include <thread>

auto now = std::chrono::system_clock::now();
auto end = now + std::chrono::seconds(10);
std::this_thread::sleep_until(end); // 暂停 10 秒钟
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

::chrono::steady_clock::now()

该函数属于 C++11 标准,需要包含头文件 <thread>,获取当前时间点(不受系统时间变化的影响)
在这里插入图片描述

代码

#include <chrono>

auto start = std::chrono::steady_clock::now();
// 一些操作
auto end = std::chrono::steady_clock::now();
std::chrono::duration<double> elapsed = end - start;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.1.usleep()

usleep():该函数属于 POSIX 标准,需要包含头文件 <>,使用时需要指定休眠的时间长度,单位为微秒。但是该函数已被弃用,建议使用 std::this_thread::sleep_for() 替代。
在这里插入图片描述

代码

#include <iostream>
#include <>   // usleep

int main() {
    std::cout << "Start sleeping..." << std::endl;
    usleep(1000000);   // 休眠 1 秒
    std::cout << "Wake up!" << std::endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

4.()

<> 头文件中的 sleep 函数用于使程序在指定的秒数内休眠,即让程序暂停执行,直到指定的时间过去为止。

使用 sleep 函数需要包含 <> 头文件,并在代码中调用函数 sleep(unsigned int seconds)。其中,seconds 参数表示要让程序休眠的秒数。
需要注意的是,使用 sleep 函数会阻塞当前线程,因此如果需要同时进行其他操作,可以考虑使用 std::thread 进行多线程编程。
在这里插入图片描述

代码

#include <>

int main() {
    // 程序暂停 5 秒钟
    sleep(5);

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
'
运行

4.3.ChatGPT回答:sleep()是C语言还是C++中哪个库的函数?

在 C/C++ 中,sleep() 函数依赖于你的操作系统:

  1. Unix/Linux: 在 Unix-like 系统中,sleep() 函数是定义在 <> 头文件中的。这个函数会使程序暂停执行指定的秒数。

    #include <>
    
    int main() {
        unsigned int seconds = 5;
        sleep(seconds);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    '
    运行
  2. Windows: 在 Windows 系统中,Sleep() 函数是定义在 <> 头文件中的,注意它的 ‘S’ 是大写的。这个函数的参数是毫秒。

    #include <>
    
    int main() {
        DWORD milliseconds = 5000;
        Sleep(milliseconds);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

在标准 C 或 C++ 中,并没有定义 sleep() 函数。这些函数都是平台特定的,与操作系统的 API 相关联。如果你在跨平台的程序中需要使用到 sleep() 功能,你可能需要根据编译目标选择不同的实现或者使用第三方库如 Boost 提供的跨平台函数。

中的ros::Duration::sleep()

需要注意的是,1-4方法都是用于暂停当前线程的执行。如果需要暂停整个程序的执行,建议使用 ROS 中的 ros::Duration::sleep() 方法,因为它会在暂停期间继续处理 ROS 的消息循环。

在ROS中,建议使用 ros::Rate 类来控制循环的执行频率,而不是使用 sleep 函数来暂停程序。ros::Rate 类可以保证程序在一定频率内运行,并且自动计算和控制休眠时间,从而达到精确控制循环频率的目的。

在ROS中,ros::Duration::sleep()是一个用于暂停程序执行一段时间的函数。它接受一个 ros::Duration 对象,表示程序要暂停的时间长度。

以下是一个例子,程序会在发布两条消息之间暂停 1 秒钟:
在这里插入图片描述

在这个例子中,我们使用了 ros::Duration(1.0) 来创建一个 1 秒钟的 ros::Duration 对象,并传递给 sleep() 方法,使得程序暂停了 1 秒钟。
代码

#include "ros/"
#include "std_msgs/"

int main(int argc, char **argv) {
    ros::init(argc, argv, "example_node");
    ros::NodeHandle nh;

    ros::Publisher pub = nh.advertise<std_msgs::String>("example_topic", 10);

    while (ros::ok()) {
        std_msgs::String msg;
        msg.data = "Hello, world!";
        pub.publish(msg);

        ros::Duration(1.0).sleep(); // 暂停 1 秒钟

        msg.data = "Goodbye, world!";
        pub.publish(msg);

        ros::Duration(1.0).sleep(); // 暂停 1 秒钟
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

API——Sleep()函数

在这里插入图片描述

++中的wait_for函数

7.::condition_variable::wait_for()

在这里插入图片描述

7.::future::wait_for() 或 std::shared_future::wait_for()

在这里插入图片描述

以上两种wait_for方法都可以在一定时间内等待一些操作或条件。然而,它们的应用场景和使用方法是不同的。

::this_thread::sleep(boost::posix_time::milliseconds(200));

在这里插入图片描述

::posix_time

boost::posix_time 是 Boost.Date_Time 库的一部分,提供了一套用于表示时间和日期的类型和函数。这些类型和函数是基于 POSIX 时间规范的,所以被称为 “POSIX 时间”。

Boost.Date_Time 库提供了一组完整的、与平台无关的日期和时间处理功能,使得 C++ 开发者能够在不同的平台上处理日期和时间。

以下是 boost::posix_time 中一些常用的类型和函数:

  1. ptime: 代表一个时间点。它由一个日期和一个时间间隔组成。

    boost::posix_time::ptime t1(boost::posix_time::second_clock::local_time());
    
    • 1
  2. time_duration: 代表一个时间间隔。

    boost::posix_time::time_duration td(1, 10, 30);  // 1小时,10分钟,30秒
    
    • 1
  3. time_period: 代表一个时间段,由两个时间点组成。

    boost::posix_time::ptime t2 = t1 + boost::posix_time::hours(1);
    boost::posix_time::time_period tp(t1, t2);
    
    • 1
    • 2
  4. second_clockmicrosec_clock: 提供了获取当前系统时间的方法。

    boost::posix_time::ptime t3 = boost::posix_time::second_clock::local_time();   // 精确到秒
    boost::posix_time::ptime t4 = boost::posix_time::microsec_clock::local_time(); // 精确到微秒
    
    • 1
    • 2

以上只是一些基本的类型和函数。boost::posix_time 库还提供了一系列的函数来进行日期和时间的运算,如加法、减法、比较等。同时,它还支持从字符串解析时间,以及将时间格式化为字符串。

需要注意的是,从 C++11 开始,C++ 标准库也开始提供了一套完整的日期和时间处理功能,即 <chrono> 库。如果你的编译器支持 C++11 或更高版本的 C++,你也可以考虑使用 <chrono> 库来处理日期和时间,而不是使用 boost::posix_time

C++环境中的sleep:QThread::sleep(num)

Qt 的 QThread 类提供了三个静态函数来让当前线程暂停:

  • QThread::sleep(unsigned long secs):暂停线程几秒
  • QThread::msleep(unsigned long msecs):暂停线程几毫秒
  • QThread::usleep(unsigned long usecs):暂停线程几微秒

这些方法直接作用于当前线程,非常容易使用,但需要注意,它们会阻塞线程,直到指定的时间过去。

示例代码:

#include <QThread>
#include <QDebug>

void exampleFunction() {
    qDebug() << "Starting delay...";
    QThread::sleep(2);  // Sleep for 2 seconds
    qDebug() << "2 seconds passed.";
    QThread::msleep(500);  // Sleep for 500 milliseconds
    qDebug() << "500 milliseconds passed.";
}

int main() {
    exampleFunction();
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15