前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++编程中的system终端命令与thread并行基础和进阶(含ROS2 CLI)

C++编程中的system终端命令与thread并行基础和进阶(含ROS2 CLI)

作者头像
zhangrelay
发布2022-08-10 15:27:07
4640
发布2022-08-10 15:27:07
举报
文章被收录于专栏:机器人课程与技术

由简单到复杂一步一步来吧。

hello ros2为例:

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main ()
{
    cout << "Hello ros2!" << endl;
    system("pause");
    return 0;
}

此处使用的是:

system("pause");

linux下会出现:

这种方式适合windows环境^_^ 

沉迷机器人操作系统的一个理由和四种修仙秘籍(更新ROS 2.0内容)


那怎么办?改一个支持的就行啦,比如date:

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main ()
{
    cout << "Hello ros2!" << endl;
    system("date");
    return 0;
}

妥妥的显示时间:

终端支持的命令都是可以的^_^ 


来个复杂一点的,启动ROS2的小乌龟可以吗?

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main ()
{
    cout << "Hello ros2 turtlesim!" << endl;
    system("ros2 run turtlesim turtlesim_node");
    return 0;
}

完美启动,如下:

可不可以同时运行多条指令起到launch的作用呢?

试试看吧:

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main ()
{
    cout << "Hello ros2 turtlesim!" << endl;
    system("ros2 run turtlesim turtlesim_node");
    system("ros2 run turtlesim turtle_teleop_key"); 
    return 0;
}

不行哦,需要关闭一个才能开启下一个。

那怎么办呢???

参考之前这篇博文:

蓝桥ROS机器人之现代C++学习笔记7.1 并行基础


程序如下:

代码语言:javascript
复制
#include <iostream>
#include <thread>
using namespace std;

void turtlesim_node()
{
    system("ros2 run turtlesim turtlesim_node");
}

void turtle_teleop_key()
{
    system("ros2 run turtlesim turtle_teleop_key"); 
}


int main ()
{
    cout << "Hello ros2 turtlesim!" << endl;
    
    thread th1(turtlesim_node);
    thread th2(turtle_teleop_key);

    th1.join();
    th2.join();

    return 0;
}

同样,这样就可以启动多个ROS1/ROS2节点。 


基本概念:

system() 用于从 C/C++ 程序调用操作系统命令。

注意:需要包含 stdlib.h 或 cstdlib 才能调用系统。

使用 system(),如果操作系统允许,可以执行任何可以在终端上运行的命令。 例如,可以在 Windows 上调用 system(“dir”) 并调用 system(“ls”) 来列出目录的内容。

编写一个可以编译和运行其他程序的 C/C++ 程序?

可以使用 system() 从我们的程序中调用 gcc。 请参阅下面为 Linux 编写的代码。 可以轻松更改代码以在 Windows 上运行。

多线程支持是在 C+11 中引入的。 在 C++11 之前,必须在 C 中使用 POSIX 线程或 p 线程库。虽然这个库完成了这项工作,但缺乏任何标准语言提供的功能集会导致严重的可移植性问题。 C++ 11 取消了所有这些,并为提供了 std::thread。 线程类和相关函数在线程头文件中定义。

std::thread 是 C++ 中表示单个线程的线程类。 要启动一个线程,只需要创建一个新的线程对象并将要调用的执行代码(即可调用对象)传递给对象的构造函数。 创建对象后,将启动一个新线程,该线程将执行 callable 中指定的代码。

可调用对象可以是三个中的任何一个

  • 函数指针
  • 一个函数对象
  • 一个 lambda 表达式

定义可调用对象后,将其传递给构造函数。


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档