C++笔记之sleep总结
—— 2023年4月9日 小问 上海
code review
文章目录
- C++笔记之sleep总结
- 1.std::this\_thread::sleep\_for()
- 附:std::this\_thread::sleep\_for(std::chrono::duration)
- 2.std::this\_thread::sleep\_until()
- 附:std::this\_thread::sleep\_until(std::chrono::time\_point)
- 3.std::chrono::steady\_clock::now()
- 4.1.usleep()
- 4.2.sleep()
- 5.ros中的ros::Duration::sleep()
- 6.Windows API——Sleep()函数
- 7.C++中的wait\_for函数
- 7.1.std::condition\_variable::wait\_for()
- 7.2.std::future::wait\_for() 或 std::shared\_future::wait\_for()
- 8.boost::this\_thread::sleep(boost::posix\_time::milliseconds(200));
- 9.boost::posix\_time
1.std::this_thread::sleep_for()
该函数属于 C++11 标准,需要包含头文件 <thread>,使用时需要指定休眠的时间长度。
代码
#include <iostream>
#include <chrono> // std::chrono::seconds
#include <thread> // std::this_thread::sleep_forint main() {std::cout << "Start sleeping..." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));std::cout << "Wake up!" << std::endl;return 0;
}
附:std::this_thread::sleep_for(std::chrono::duration)
代码
#include <chrono>
#include <thread>std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 暂停 100 毫秒
2.std::this_thread::sleep_until()
该函数属于 C++11 标准,需要包含头文件 <thread>,使用时需要指定休眠的时间点。
代码
#include <iostream>
#include <chrono> // std::chrono::system_clock, std::chrono::seconds
#include <thread> // std::this_thread::sleep_untilint 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;
}
附: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 秒钟
3.std::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;
4.1.usleep()
usleep():该函数属于 POSIX 标准,需要包含头文件 <unistd.h>,使用时需要指定休眠的时间长度,单位为微秒。但是该函数已被弃用,建议使用 std::this_thread::sleep_for() 替代。
代码
#include <iostream>
#include <unistd.h> // usleepint main() {std::cout << "Start sleeping..." << std::endl;usleep(1000000); // 休眠 1 秒std::cout << "Wake up!" << std::endl;return 0;
}
4.2.sleep()
unistd.h> 头文件中的 sleep 函数用于使程序在指定的秒数内休眠,即让程序暂停执行,直到指定的时间过去为止。
使用 sleep 函数需要包含 <unistd.h> 头文件,并在代码中调用函数 sleep(unsigned int seconds)。其中,seconds 参数表示要让程序休眠的秒数。
需要注意的是,使用 sleep 函数会阻塞当前线程,因此如果需要同时进行其他操作,可以考虑使用 std::thread 进行多线程编程。
代码
#include <unistd.h>int main() {// 程序暂停 5 秒钟sleep(5);return 0;
}
5.ros中的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/ros.h"
#include "std_msgs/String.h"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;
}
6.Windows API——Sleep()函数
7.C++中的wait_for函数
7.1.std::condition_variable::wait_for()
7.2.std::future::wait_for() 或 std::shared_future::wait_for()
以上两种wait_for方法都可以在一定时间内等待一些操作或条件。然而,它们的应用场景和使用方法是不同的。
8.boost::this_thread::sleep(boost::posix_time::milliseconds(200));
9.boost::posix_time
boost::posix_time
是 Boost.Date_Time 库的一部分,提供了一套用于表示时间和日期的类型和函数。这些类型和函数是基于 POSIX 时间规范的,所以被称为 “POSIX 时间”。
Boost.Date_Time 库提供了一组完整的、与平台无关的日期和时间处理功能,使得 C++ 开发者能够在不同的平台上处理日期和时间。
以下是 boost::posix_time
中一些常用的类型和函数:
-
ptime: 代表一个时间点。它由一个日期和一个时间间隔组成。
boost::posix_time::ptime t1(boost::posix_time::second_clock::local_time());
-
time_duration: 代表一个时间间隔。
boost::posix_time::time_duration td(1, 10, 30); // 1小时,10分钟,30秒
-
time_period: 代表一个时间段,由两个时间点组成。
boost::posix_time::ptime t2 = t1 + boost::posix_time::hours(1); boost::posix_time::time_period tp(t1, t2);
-
second_clock 和 microsec_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(); // 精确到微秒
以上只是一些基本的类型和函数。boost::posix_time
库还提供了一系列的函数来进行日期和时间的运算,如加法、减法、比较等。同时,它还支持从字符串解析时间,以及将时间格式化为字符串。
需要注意的是,从 C++11 开始,C++ 标准库也开始提供了一套完整的日期和时间处理功能,即 <chrono>
库。如果你的编译器支持 C++11 或更高版本的 C++,你也可以考虑使用 <chrono>
库来处理日期和时间,而不是使用 boost::posix_time
。