C++实操 - 如何在程序中delay一段时间

在程序中运行的都是以进程为单位,进程里面的任务或线程有时需要“sleep”或者进入一个休眠状态一段时间。

在这期间,此线程代码执行被暂停。

当时间到了后,代码恢复执行(或者由信号或中断导致)。

为了使一个程序(进程、任务、线程 / process, task, thread)进入sleep状态,可以使用系统调用。

比如,Linux/Unix下:

#include <unistd.h>

int main( )

{

  sleep(3);  // sleep 3 seconds

  return 0; 

}

Windows下:

#include <Windows.h>

int main( )

{

  Sleep(3000);  // sleep 3000 milliseconds

  return 0;

}

如果代码要兼容Linux和Windows平台:

#ifdef _WIN32

#include <Windows.h>

#else

#include <unistd.h>

#endif

函数原型:

unsigned sleep(unsigned seconds)。

参数:

seconds => 程序暂停执行的时间(秒)。

返回值:

0 => 请求的休眠时间之后,函数返回。

如果休眠被信号打断,那么将返回一个不足的休眠时间量(指定的请求时间段减去实际经过的时间)。

说明:

sleep()函数使程序或被调用的进程暂时停止执行,时间由函数参数指定,单位为秒。执行被暂停,直到所要求的时间过后,或有信号或中断传递给该函数。

但是,如果系统调度了任何其他活动,那么暂停时间可能更长。

usleep( ) 函数

在Linux的头文件unistd.h中,还提供了另一个函数 "usleep()",它可以在指定时间内暂停程序的执行。其工作原理与前面介绍的sleep( )函数类似。

函数原型:int usleep(useconds_t useconds)。

参数: useconds => 暂停执行的微秒数

返回值

0 => usleep已经成功返回。

-1 & errno => 函数执行失败。

说明:

函数usleep()暂停调用线程的执行,时间为参数指定的微秒或有信号传递给暂停的线程导致中断此函数执行。

usleep函数中使用的定时器值的最小单位(精度)可能依赖于特定的实现。

具体例子和上面的sleep函数类似。

------------------------------------------------  

Thread Sleep (sleep_for & sleep_until)

在C++11中,提供了专门的函数来实现线程休眠。

有两个函数, 第一个:

std::this_thread::sleep_for

函数原型:

template< class Rep, class Period >

void sleep_for( const std::chrono::duration<Rep, Period>& sleep_duration ) 。

参数: sleep_duration => 睡眠的时间量

返回值:无

描述:

sleep_for()函数定义在头文件<thread>中。sleep_for()函数至少在指定的时间内阻断当前线程的执行,即sleep_duration。

由于调度活动或资源争夺的延迟,这个函数可能会阻塞比指定时间更长的时间。

#include <chrono>

#include <thread>

using namespace std;

  

int main()

{

    this_thread::sleep_for(chrono::milliseconds(2000) ); // sleep for 2s

    return 0;

}

注:chrono一般是一个表示时间意思的英语前缀。

第二个:

std::this_thread::sleep_until

函数原型:

template< class Clock, class Duration >

void sleep_until( const std::chrono::time_point<Clock,Duration>& sleep_time );

参数:sleep_time => 线程被阻塞的停止时间。

返回值:无

描述:

这个函数定义在头文件<thread>中。sleep_until( ) 函数会阻塞当前线程的执行,直到到达指定的时间点,恢复执行。

同样的,由于调度活动或资源争夺的延迟,这个函数可能会阻塞比指定时间更长的时间。

#include <chrono>
#include <thread>

using namespace std;


void threadFunc(void)
{

  chrono::system_clock::time_point timePt = chrono::system_clock::now() + chrono::seconds(5);


  this_thread::sleep_until(timePt);
}


int main()
{
  std::thread th(&threadFunc);
  th.join();
  return 0;
}


$ g++ -o test test.cpp -pthread

上面程序将等待5s后,结束执行。

在C++14中,提供了字面值后缀功能(literal suffixex):

#include <chrono>
#include <thread>


int main() {

    using namespace std::this_thread;     // sleep_for, sleep_until
    using namespace std::chrono_literals; // ns, us, ms, s, h, etc.
    using std::chrono::system_clock;


    sleep_for(10ns);
    sleep_until(system_clock::now() + 1s);

}


/* Error */
$ g++ -o test test.cpp -std=c++11



/* OK */
$ g++ -o test test.cpp -std=c++14

上面这个例子,用到了C++的thread头文件,都没用到Linux中的thread库,所以g++编译时不需要加-pthread。

参考:

C++ Sleep: How To Use The Sleep Function in C++ Programshttps://www.softwaretestinghelp.com/cpp-sleep/

### 回答1: ORB-SLAM3 是一种用于实时摄像头SLAM (Simultaneous Localization and Mapping) 的开源系统。以下是在Ubuntu操作系统上实操ORB-SLAM3程序的步骤: 1. 安装依赖项 ORB-SLAM3需要安装一些依赖项,包括Eigen, Pangolin, OpenCV, g2o等。可以通过命令行安装这些依赖项,例如: ``` sudo apt-get install libeigen3-dev libpangolin-dev libopencv-dev libopencv-highgui-dev libopencv-calib3d-dev libopencv-contrib-dev libopencv-imgproc-dev libopencv-video-dev libglew-dev libc++-dev libblas-dev liblapack-dev libatlas-base-dev libsuitesparse-dev ``` 2. 下载ORB-SLAM3 可以在ORB-SLAM3的官方网站上下载源代码。 3. 编译ORB-SLAM3 进入ORB-SLAM3的源代码目录,运行以下命令: ``` mkdir build cd build cmake .. make ``` 4. 运行ORB-SLAM3 运行以下命令启动ORB-SLAM3: ``` ./Examples/Monocular/mono_tum Vocabulary/ORBvoc.txt Examples/Monocular/TUM1.yaml /path/to/dataset ``` 其,/path/to/dataset是要处理的数据集的路径。 以上是在Ubuntu上实操ORB-SLAM3程序的基本步骤。但是在具体操作,还需要根据实际情况进行一些参数配置和调试。 ### 回答2: 要实操ORB-SLAM3的程序,可以按照以下步骤进行: 1. 环境配置:首先需要在计算机上配置好相应的环境。ORB-SLAM3是一个基于C++的开源项目,可以在GitHub上找到其源代码。在配置环境过程,需要确保计算机上安装了CMake、OpenCV和Pangolin等必要的依赖库。 2. 下载ORB-SLAM3代码:在GitHub上找到ORB-SLAM3的源代码,并将其下载到本地计算机上。确保下载的版本是稳定的,并且符合你的实际需求。 3. 构建项目:使用CMake工具,根据ORB-SLAM3的CMakeLists.txt文件,构建可执行文件。这一步将会编译源代码并生成可执行文件,用于运行ORB-SLAM3程序。 4. 准备数据集:为了运行ORB-SLAM3,需要准备一个实际的数据集,可以是从相机或者其他传感器获得的视频或图像序列。确保数据集包含足够多的特征点和图像质量较好。 5. 运行ORB-SLAM3:执行生成的可执行文件,并指定数据集的路径作为输入参数。ORB-SLAM3将自动读取数据集,进行图像特征提取、相机位姿估计、特征点匹配等计算,并输出实时的相机轨迹和三维地图重建结果。 6. 分析和调试:根据ORB-SLAM3的输出结果,可以对实际运行的效果进行分析和调试。观察相机轨迹是否准确,重建的三维地图是否符合预期,并检查是否存在错误或异常情况。 总结:实操ORB-SLAM3的程序主要包括环境配置、下载源代码、构建项目、准备数据集、运行程序和分析调试。通过这些步骤,可以使用ORB-SLAM3进行实时的视觉SLAM(同时定位与地图构建),并从输入的图像序列获取相机的位置姿态和环境的三维结构。 ### 回答3: 要实操ORB-SLAM3的程序,可以按照以下步骤进行操作: 1. 环境准备:首先,需要准备好合适的硬件设备,如搭载Ubuntu操作系统的计算机和摄像头。然后,在计算机上安装相应的开发环境和依赖库,如CMake、OpenCV和Eigen等。 2. 下载源代码:在ORB-SLAM3的GitHub仓库上,下载源代码并解压到本地。可以通过命令行或者GUI界面进行操作。 3. 编译代码:使用CMake来构建和编译ORB-SLAM3的源代码。在终端切换到ORB-SLAM3的根目录,在终端执行以下命令: ``` mkdir build cd build cmake .. make -j ``` 这将生成可执行文件和相关的库文件。 4. 数据集准备:获取用于测试的数据集,可以是视频文件或图像序列。确保数据集与ORB-SLAM3的输入格式兼容,如图像的分辨率和格式等。 5. 运行程序:在终端执行以下命令,运行ORB-SLAM3程序,并指定数据集作为输入: ``` ./Examples/Monocular/mono_sam Examples/Monocular/Vocabulary/ORBvoc.txt Examples/Monocular/KITTI00-02.yaml path_to_dataset_directory ``` 其,ORBvoc.txt是ORB特征词汇文件,KITTI00-02.yaml是相机参数文件,path_to_dataset_directory是数据集所在的目录。 6. 观察结果:ORB-SLAM3程序将会运行,并输出实时的相机位姿估计和场景重建结果。可以在控制台观察输出信息,或者在图形界面查看实时的相机轨迹和稀疏点云重建结果。 需要注意的是,实操ORB-SLAM3的程序需要一定的编程和计算机视觉知识基础,同时要理解程序的工作原理和参数配置。此外,为了获得更好的实验结果,可以尝试不同的配置和数据集,以及对源代码进行定制化开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夜流冰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值