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()
函数依赖于你的操作系统:
-
Unix/Linux: 在 Unix-like 系统中,
sleep()
函数是定义在<>
头文件中的。这个函数会使程序暂停执行指定的秒数。#include <> int main() { unsigned int seconds = 5; sleep(seconds); return 0; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
运行 -
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
中一些常用的类型和函数:
-
ptime: 代表一个时间点。它由一个日期和一个时间间隔组成。
boost::posix_time::ptime t1(boost::posix_time::second_clock::local_time());
- 1
-
time_duration: 代表一个时间间隔。
boost::posix_time::time_duration td(1, 10, 30); // 1小时,10分钟,30秒
- 1
-
time_period: 代表一个时间段,由两个时间点组成。
boost::posix_time::ptime t2 = t1 + boost::posix_time::hours(1); boost::posix_time::time_period tp(t1, t2);
- 1
- 2
-
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(); // 精确到微秒
- 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